Как сохранить Map‹Entity, Entity› с семантикой карты в JPA2

У меня есть следующая модель: сущность типа A связана со многими парами сущностей типов (B, C). Каждый объект B появляется не более чем в одной паре в A, но один и тот же объект C может отображаться в нескольких парах. Например:

A1 --> (B1, C1)
   --> (B2, C2)
   --> (B3, C1)

A2 --> (B1, C3)
   --> (B2, C4)
   --> (B3, C4)

Это следует семантике java.util.Map‹B, C›, хранящейся в A. Кроме того, каждый C появляется только для одного объекта A, поэтому отношение A к C — OneToMany. Я хотел бы сохранить такую ​​карту, и аналогичный пример появляется в Документация по Java EE6. Насколько я могу судить, мой код (ниже) практически идентичен примеру:

@Entity
public class A implements Serializable {
    @OneToMany(fetch= FetchType.EAGER)
    @JoinTable(name="A_BC_MAP",
            joinColumns=@JoinColumn(name="A_ID"),
            inverseJoinColumns=@JoinColumn(name="C_ID"))
    @MapKeyJoinColumn(name="B_ID")
    private Map<B, C> pinnedCourses = new HashMap<Course, ScheduleTerm>();
    ...
}

Схема базы данных для A_BC_MAP появляется, как и ожидалось, с таблицей соединения из трех столбцов (A_ID, B_ID, C_ID). Однако ограничение первичного ключа состоит из пары (A_ID, C_ID). Поэтому я не могу хранить в базе данных более одного (ключа карты) B с тем же (значением карты) C, что и в карте.

Это ожидаемое поведение? Для семантики карты я ожидаю, что первичный ключ будет состоять из (A_ID, B_ID). Я делаю что-то неправильно?

В настоящее время я использую EclipseLink 2.3.0.


person Jonathan Dautrich    schedule 24.07.2012    source источник


Ответы (1)


Я предполагаю, что вы используете EclipseLink для определения своего DDL? Вы всегда можете использовать свой собственный DDL-скрипт.

Наличие дубликатов в OneToMany необычно, но, вероятно, возможно с ключом карты, вы можете зарегистрировать ошибку, чтобы генерация DDL определяла ключ карты как первичный ключ вместо целевого внешнего ключа.

person James    schedule 31.07.2012
comment
Да, я использую EclipseLink и надеюсь избежать написания собственного сценария только для исправления этого элемента. Куда мне лучше всего обратиться, чтобы зарегистрировать такую ​​​​ошибку? - person Jonathan Dautrich; 16.11.2012