У меня есть следующая модель: сущность типа 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.