JPA同一类中相同类型的两个ElementCollections

时间:2011-03-23 09:14:52

标签: hibernate jpa

我正在使用JPA2规范和hibernate作为我的持久性提供程序。有人可以指导我如何在同一个类中映射两个相同类型的元素集合吗?对于例如

 public class Employee {
     @Id //...
     private Long id;

     @ElementCollection         
     private Collection<String> tempAddresses;

     @ElementCollection         
     private Collection<String> permanentAddresses;

 }

public class Employee { @Id //... private Long id; @ElementCollection private Collection<String> tempAddresses; @ElementCollection private Collection<String> permanentAddresses; }

使用加载期间的默认映射,hibernate无法区分这两个列表,因为它们使用相同的连接列(即id列)进行映射。

修改1 我忘了提到我的要求是将元素集合映射到同一个表,因为它们都是地址。所以映射应该看起来像

public class Employee { @Id //... private Long id;

     @ElementCollection     
     @CollectionTable(name = "ADDRESS", joinColumn = @JoinColumn(name = "EMP_ID"))    
     @Column(name = "ADDRESS_ID")
     private Collection<String> tempAddresses;

     @ElementCollection         
     @CollectionTable(name = "ADDRESS", joinColumn = @JoinColumn(name = "EMP_ID"))    
     @Column(name = "ADDRESS_ID")
     private Collection<String> permanentAddresses;

 }

因为两个集合都映射到同一个集合表,并且它们与相同的id列连接,因此在加载期间,hibernate无法区分哪些地址是临时的,哪些是永久性的。

1 个答案:

答案 0 :(得分:2)

  

使用加载期间的默认映射,hibernate无法区分这两个列表,因为它们使用相同的连接列(即id列)进行映射。

嗯,不!使用默认映射,hibernate将通过将它们存储在不同的表中来区分这两个列表。

  

我的要求是将元素集合映射到同一个表,因为它们都是地址。

他们都是地址。但它们有不同的用途,您显然希望区分它们。如果您使用@ElementCollection注释来映射它们,区分它们的明智方法是将它们放在不同的表格中。

另一种(更传统的)方法是创建一个地址实体,而不是将它们表示为纯字符串,并使用@OneToMany注释将它们连接到Employee类。然后所有地址确实可以在同一个表中,但是hibernate会构建将它们连接到Employee表的连接表。仍然会有两个连接表。