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

@JoinColumn@PrimaryKeyJoinColumn什么@PrimaryKeyJoinColumn

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

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

如果我也推动专栏成为一个PK(也就是识别关系),会发生什么? 由于列现在是PK,我必须用@Id标记它:

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

现在的问题是:

@Id + @JoinColumn@JoinColumn相同吗?

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

如果没有,那么@PrimaryKeyJoinColumn在那里?

如果我也推动专栏成为一个PK(也就是识别关系),会发生什么? 由于列现在是PK,我必须用@Id(…)来标记它。

派生标识符的增强支持实际上是JPA 2.0中新东西的一部分(参见2.4.1与JPA 2.0规范中派生标识相对应的主键 ),JPA 1.0不允许在OneToOneManyToOne上使用Id 。 使用JPA 1.0,您必须使用PrimaryKeyJoinColumn并为外键列定义一个Basic Id映射。

现在的问题是:@Id + @JoinColumn只是@PrimaryKeyJoinColumn?

您可以获得类似的结果,但在OneToOne上使用IdManyToOne简单得多,并且是使用JPA 2.0映射派生标识符的首选方法。 PrimaryKeyJoinColumn可能仍然用于JOINEDinheritance策略。 在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 { ... } 

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的一部分。

为了logging,在EclipseLink 1.1中添加了对OneToOneManyToOneId支持(请参阅本文来自EclipseLink comitter和Java Persistence wiki主要贡献者James Sutherland的 消息 )。 但是让我坚持,这不是 JPA 1.0的一部分。