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不允许在OneToOne
或ManyToOne
上使用Id
。 使用JPA 1.0,您必须使用PrimaryKeyJoinColumn
并为外键列定义一个Basic
Id
映射。
现在的问题是:@Id + @JoinColumn只是@PrimaryKeyJoinColumn?
您可以获得类似的结果,但在OneToOne
上使用Id
或ManyToOne
会简单得多,并且是使用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中添加了对OneToOne
和ManyToOne
的Id
支持(请参阅本文来自EclipseLink comitter和Java Persistence wiki主要贡献者James Sutherland的 消息 )。 但是让我坚持,这不是 JPA 1.0的一部分。