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

IT小君   2021-11-06T10:48:09

@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什么用?

评论(3)
IT小君

如果我也将该列提升为 a/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 { ... }

[108]第 2.4.1.1 节中描述的派生 id 机制现在优先 PrimaryKeyJoinColumn于 OneToOne 映射情况。

也可以看看


此来源http://weblogs.java.net/blog/felipegaucho/archive/2009/10/24/jpa-join-table-additional-state指出使用 @ManyToOne 和 @Id 可与 JPA 1.x 配合使用。现在谁是对的?

作者正在使用EclipseLink的预发布JPA 2.0兼容版本(本文时为2.0.0-M7)来写一篇关于 JPA 1.0(!)的文章。这篇文章具有误导性,作者使用的东西不是JPA 1.0 的一部分。

作为记录,在 EclipseLink 1.1 中添加了IdonOneToOne和 的支持ManyToOne(请参阅来自James Sutherland 的消息,EclipseLink 提交者和Java Persistence wiki 书籍的主要贡献者)。但让我坚持,这不是JPA 1.0 的一部分。

2021-11-06T10:48:09   回复
IT小君

我通常通过这张图区分这两者:

PrimaryKeyJoinColumn

在此处输入图片说明

JoinColumn

在此处输入图片说明

2021-11-06T10:48:10   回复
IT小君

我知道这是一篇旧帖子,但是PrimaryKeyColumn如果您想要单向关系或有多个表共享相同的 ID,那么使用的好时机是。

一般来说,这是一个坏主意,最好将外键关系与JoinColumn.

话虽如此,如果您正在处理使用此类系统的旧数据库,那么这将是使用它的好时机。

2021-11-06T10:48:10   回复