3

在 JPA2 中,当我们在使用 @ElementCollection 和 @CollectionTable 注释的实体中使用 Embed-able(基本类型,如 String.. 等)对象时,会创建新表,但在新表中如何在列中声明主键约束?以下是我的代码

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;

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

使用此代码,“假期”和“员工昵称”两个表在模式中创建。但我想在两个表中声明一个主键列。我为此做什么?

4

2 回答 2

1

JPA 2.0 不支持主键本身:

来自维基书籍

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

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

于 2020-01-30T16:42:47.030 回答
0

您的意思是要将 Employee 表中的“id”作为外键分配给 Vacation 表吗?在这种情况下,您应该使用 @OneToMany 而不是 @ElementCollection

于 2013-01-03T19:32:21.817 回答