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

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

用于作为外键一部分的列。典型的列可能如下所示(例如,在具有其他属性的联接表中):@JoinColumn

@ManyToOne
@JoinColumn(name = "...")
private OtherClass oc;

如果我将列提升为 a/the PK(也称为标识关系),会发生什么情况?由于该列现在是PK,因此我必须用以下代码标记它:@Id

@Id
@ManyToOne
@JoinColumn(name = "...")
private OtherClass oc;

现在的问题是:

是 + 是否与只是 ?:@Id@JoinColumn@PrimaryKeyJoinColumn

@ManyToOne
@PrimaryKeyJoinColumn(name = "...")
private OtherClass oc;

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


答案 1

如果我将列提升为 a/the PK(也称为标识关系),会发生什么情况?由于该列现在是PK,因此我必须用@Id(...)对其进行标记。

这种对派生标识符的增强支持实际上是 JPA 2.0 中新内容的一部分(请参阅 JPA 2.0 规范中与派生身份对应的主键部分),JPA 1.0 不允许在 or 上。在 JPA 1.0 中,您必须使用并定义外键列的映射。IdOneToOneManyToOnePrimaryKeyJoinColumnBasicId

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

您可以获得类似的结果,但使用 on 或 要简单得多,并且是使用 JPA 2.0 映射派生标识符的首选方法。 可能仍用于 JOIN 继承策略。在 JPA 2.0 规范的相关部分下面:IdOneToOneManyToOnePrimaryKeyJoinColumn

11.1.40 主键连接列注释

该批注指定一个主键列,该列用作外键以联接到另一个表。PrimaryKeyJoinColumn

注释用于将映射策略中实体子类的主表连接到其超类的主表;它在注释中用于将辅助表连接到主表;它可以用于映射中,其中引用实体的主键被用作引用实体的外键[108]PrimaryKeyJoinColumnJOINEDSecondaryTableOneToOne

...

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

...

例:客户和有价值的客户子类

@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 { ... }

[108]在一对一映射情况下,第2.4.1.1节中描述的派生id机制现在比PrimaryKeyJoinColumn更可取。

另请参见


该源代码 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 的一部分。

为了记录,在EclipseLink 1.1中添加了对on的支持(请参阅James Sutherland,EclipseLink comitter和Java Persistence wiki书籍的主要贡献者的这条消息)。但让我坚持,这不是JPA 1.0的一部分。IdOneToOneManyToOne


答案 2

我通常通过下图来区分这两者:

PrimaryKeyJoinColumn

enter image description here

JoinColumn

enter image description here


推荐