【问题标题】:JPA 2: how to declare primary-key columns in @ElementCollection tablesJPA 2:如何在 @ElementCollection 表中声明主键列
【发布时间】:2012-12-17 21:54:03
【问题描述】:

在 JPA2 中,当我们在使用 @ElementCollection 和 @CollectionTable 注释的实体中使用 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”两个表在模式中创建。但我想在两个表中声明一个主键列。我为此做什么?

【问题讨论】:

  • 能否把完整的代码,包括Vacation类的代码放上来?

标签: java hibernate jpa annotations jpa-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。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 否,使用此代码,这两个表是创建假期和昵称,这些表是在运行时创建的。在这些表中没有主键列。我想在这个表中声明主键列。
    • 你把完整的代码。如果您在假期班中已经有一个主键属性,请务必提及,或者您是否想创建一个代理主键。没有代码,很难理解你想要什么。提醒一下,hibernate 创建的表总是有一个主键。 Hibernate 是 ORM 工具。 R 代表“关系”,没有主键,就没有“R” :)
    • 他的意思是表vacations上的主键。喜欢PK(Emp_Id, vacationBooking)
    猜你喜欢
    • 1970-01-01
    • 2015-06-30
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多