JPA:@JoinColumn和@PrimaryKeyJoinColumn之间的区别?

Kaw*_*awu 74 java hibernate jpa java-ee identifying-relationship

@JoinColumn和之间的确切区别是@PrimaryKeyJoinColumn什么?

@JoinColumn用于属于外键的列.典型的列可能看起来像(例如在具有附加属性的连接表中):

@ManyToOne
@JoinColumn(name = "...")
private OtherClass oc;
Run Code Online (Sandbox Code Playgroud)

如果我将列提升为/ PK(也就是识别关系)会发生什么?由于该列现在是PK,我必须用以下标记来标记@Id:

@Id
@ManyToOne
@JoinColumn(name = "...")
private OtherClass oc;
Run Code Online (Sandbox Code Playgroud)

现在的问题是:

@Id+ @JoinColumn只是一样@PrimaryKeyJoinColumn吗?:

@ManyToOne
@PrimaryKeyJoinColumn(name = "...")
private OtherClass oc;
Run Code Online (Sandbox Code Playgroud)

如果没有,那@PrimaryKeyJoinColumn有什么用?

Pas*_*ent 49

如果我将列提升为/ PK(也就是识别关系)会发生什么?由于列现在是PK,我必须用@Id(...)标记它.

这种对派生标识符的增强支持实际上是JPA 2.0中新内容的一部分(参见JPA 2.0规范中对应于派生身份的2.4.1主键),JPA 1.0不允许Id使用OneToOneManyToOne.使用JPA 1.0,您必须使用PrimaryKeyJoinColumn并定义Basic Id外键列的映射.

现在问题是:@Id + @JoinColumn和@PrimaryKeyJoinColumn一样吗?

可以得到类似的结果,但使用IdOneToOneManyToOne简单得多,并且是衍生识别符与JPA 2.0映射的首选方式.PrimaryKeyJoinColumn可能仍会在JOINED继承策略中使用.在JPA 2.0规范的相关部分下面:

11.1.40 PrimaryKeyJoinColumn注释

PrimaryKeyJoinColumn批注指定用作外键加入到另一个表的主键列.

PrimaryKeyJoinColumn注释用于连接在一个实体子类的主表JOINED 映射策略到它的父类的主表; 它在 SecondaryTable注释中用于将辅助表连接到主表; 它可以用在OneToOne 映射中,其中引用实体的主键被用作引用实体的外键[108].

...

如果PrimaryKeyJoinColumn 在JOINED映射策略中没有为子类指定注释,则假定外键列具有与超类主表的主键列相同的名称.

...

示例: Customer和ValuedCustomer子类

@Entity
@Table(name="CUST")
@Inheritance(strategy=JOINED)
@DiscriminatorValue("CUST")
public class Customer { ... }

@Entity
@Table(name="VCUST")
@DiscriminatorValue("VCUST")
@PrimaryKeyJoinColumn(name="CUST_ID")
public class ValuedCustomer extends Customer { ... }
Run Code Online (Sandbox Code Playgroud)

[108] 现在,PrimaryKeyJoinColumn对于OneToOne映射情况,第2.4.1.1节中描述的派生id机制更 受欢迎.

也可以看看


此源http://weblogs.java.net/blog/felipegaucho/archive/2009/10/24/jpa-join-table-additional-state声明使用@ManyToOne和@Id适用于JPA 1.x. 谁现在正确?

作者正在使用预发布的JPA 2.0兼容版本的EclipseLink(文章发布时为2.0.0-M7)来撰写有关JPA 1.0(!)的文章.本文具有误导性,作者使用的东西属于JPA 1.0.

为了记录在案,支持IdOneToOneManyToOne已经在1.1的EclipseLink增加(见此消息来自詹姆斯·萨瑟兰,的EclipseLink comitter和的主要贡献者的Java Persistence维基书).但我要坚持,这不是 JPA 1.0的一部分.


GMs*_*soF 29

我通常通过这个图来区分这两个:

使用 PrimaryKeyJoinColumn

在此输入图像描述

使用 JoinColumn

在此输入图像描述

  • @yusher,`PrimaryKeyJoinColumn` 使用相同的主键值来连接两个表,而`JoinColumn`,主表的主键将成为另一个表中的外键。 (4认同)