我正在使用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无法区分哪些地址是临时的,哪些是永久性的。
答案 0 :(得分:2)
使用加载期间的默认映射,hibernate无法区分这两个列表,因为它们使用相同的连接列(即id列)进行映射。
嗯,不!使用默认映射,hibernate将通过将它们存储在不同的表中来区分这两个列表。
我的要求是将元素集合映射到同一个表,因为它们都是地址。
他们都是地址。但它们有不同的用途,您显然希望区分它们。如果您使用@ElementCollection
注释来映射它们,区分它们的明智方法是将它们放在不同的表格中。
另一种(更传统的)方法是创建一个地址实体,而不是将它们表示为纯字符串,并使用@OneToMany
注释将它们连接到Employee类。然后所有地址确实可以在同一个表中,但是hibernate会构建将它们连接到Employee表的连接表。仍然会有两个连接表。