Как сохранить карту <EntityA, EntityB> в JPA2? - PullRequest
1 голос
/ 10 января 2011

У меня есть три класса сущностей ( A , B , C ). A должен содержать карту, которая отображает экземпляры B на экземпляры C .Все экземпляры C принадлежат карте какого-то A .Я пробовал это (геттеры и сеттеры опущены):

@Entity public class A {
  @Id @GeneratedValue private Long id;

  // I want to map this in an elegant way:
  @OneToMany(mappedBy="a") @MapKey(name="b") private Map<B, C> map;
}

@Entity public class B {
  @Id @GeneratedValue private Long id;
}

@Entity public class C {
  @Id @GeneratedValue private Long id;

  // I don't really want the following in Java, unidirectional access from A to C would suffice:
  @ManyToOne private A a;
  @ManyToOne private B b;
  // Can I get rid of a and b?
}

Это дает хорошую схему (именно ту, которую я хочу!), Но в Java есть ужасное дублирование, учитывая, что теперь есть два способа указать отношение:

a.map.put(b, c);

и

c.a = a;
c.b = b;

Что произойдет, если я просто поменяю половину ассоциации?Это выглядит проблематично.Как лучше обойти это?Нет ли более элегантного решения для требуемого однонаправленного доступа?

Я подумал сделать C @Embeddable и использовать @ElementCollection для A.map , но вРеальность C - это абстрактный базовый класс для различных объектов, что означает, что его нельзя сделать @ Embeddable.

1 Ответ

0 голосов
/ 10 января 2011

Не уверен, какую схему вы хотите использовать, но вы можете использовать @MapKeyJoinColumn, чтобы сделать это отношение однонаправленным, см. Пример 1 в javadoc.

...