JPA 2:如何在@ElementCollection表中声明主键列

时间:2013-01-03 14:11:58

标签: java hibernate jpa annotations jpa-2.0

JPA2中的

当我们使用@ElementCollection和@CollectionTable注释在Entity中使用Embed-able(Basic Type like String .. etc)对象时,会创建新表,但是在新表中如何声明主键约束在专栏?以下是我的代码

public class Employee {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
private String name; 
private String salary;
@Transient
private String phnNum;
@Enumerated(EnumType.STRING)
private EmployeeType type;

@ElementCollection
@CollectionTable(name="vacations" , joinColumns=@JoinColumn(name="Emp_Id"))
private Collection<Vacation> vacationBooking;

@ElementCollection
private Set<String> nickNames;

    ...................

使用此代码,“vacation”和“employee_nickname”将在架构中创建两个表。但我想在两个表中声明一个主键列。我为此做了什么?

2 个答案:

答案 0 :(得分:1)

JPA 2.0似乎不支持主键本身

来自Wikibooks

JPA 2.0规范没有提供在Embeddable中定义ID的方法。但是,要删除或更新ElementCollection映射的元素,通常需要一些唯一键。否则,在每次更新时,JPA提供程序都将需要从实体的CollectionTable中删除所有内容,然后再将值插入回去。因此,JPA提供程序很可能会假定Embeddable中所有字段的组合与外键(JoinColumn(s))组合在一起都是唯一的。但是,如果Embeddable很大或很复杂,这可能效率很低,或者根本不可行。

某些JPA提供程序可能允许在Embeddable中指定ID,以解决此问题。请注意,在这种情况下,对于集合,该ID仅需是唯一的,而不是该表,因为其中包括外键。有些可能还允许将CollectionTable上的唯一选项用于此目的。否则,如果您的Embeddable很复杂,则可以考虑将其设为一个实体,而改用OneToMany。

答案 1 :(得分:0)

你的意思是你想把Employee表中的'id'作为Vacation表的外键吗? 在这种情况下,您应该使用@OneToMany而不是@ElementCollection