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

新手上路,请多包涵

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

您使用 @JoinColumn 作为外键一部分的列。典型的列可能如下所示(例如,在具有附加属性的连接表中):

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

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

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

现在的问题是:

@Id + @JoinColumn @PrimaryKeyJoinColumn 吗?

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

如果不是,那么 @PrimaryKeyJoinColumn 有什么用?

原文由 Kawu 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 809
2 个回答

如果我也将列提升为 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 一样吗?

您可以获得类似的结果,但在 --- 或 Id 上使用 OneToOneManyToOne 更简单,并且是使用 JPA 派生标识符的首选方法。 PrimaryKeyJoinColumn 可能仍用于 JOINED 继承策略。在 JPA 2.0 规范的相关部分下方:

11.1.40 PrimaryKeyJoinColumn 注解

PrimaryKeyJoinColumn 注释指定了一个主键列,用作连接到另一个表的外键。

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

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

示例: 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 一起使用。现在谁是对的?

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

作为记录,对 Id 的支持 OneToOneManyToOne 已添加到 Eclipse 和来自 James 1.1 的主要贡献者链接 SuitterLink 的主要贡献者 消息Java 持久性 wiki 书)。但我要坚持,这 不是 JPA 1.0 的一部分。

原文由 Pascal Thivent 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

使用 PrimaryKeyJoinColumn

在此处输入图像描述

使用 JoinColumn

在此处输入图像描述

原文由 Sam YC 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题