一尘不染

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

hibernate

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

您使用@JoinColumn的列是外键的一部分。典型的列可能看起来像(例如,在具有附加属性的联接表中):

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

如果我也将列也提升为a / PK(又称为识别关系)会怎样?由于该列现在是PK,因此我必须用标记@Id

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

现在的问题是:

@Id+ @JoinColumn上面一样@PrimaryKeyJoinColumn

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

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


阅读 1464

收藏
2020-06-20

共1个答案

一尘不染

如果我也将列也提升为a / PK(又称为识别关系)会怎样?由于该列现在是PK,因此必须使用@Id(…)对其进行标记。

派生标识符的 增强支持实际上是JPA2.0中新内容的一部分(请参阅JPA 2.0规范中的 2.4.1与派生身份相对应的主键部分),JPA1.0不允许IdOneToOne或上使用ManyToOne。在JPA
1.0中,您必须使用外键列PrimaryKeyJoinColumnBasic Id为其定义一个映射。

现在的问题是:@Id + @JoinColumn与@PrimaryKeyJoinColumn是否相同?

您可以获得类似的结果,但是使用Idon OneToOneManyToOne简单得多 ,这是使用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 { ... }

[108] 对于OneToOne映射情况, 现在将首选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的一部分。

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

2020-06-20