@JoinColumn和之间的确切区别是@PrimaryKeyJoinColumn什么?
@JoinColumn
@PrimaryKeyJoinColumn
您使用@JoinColumn的列是外键的一部分。典型的列可能看起来像(例如,在具有附加属性的联接表中):
@ManyToOne @JoinColumn(name = "...") private OtherClass oc;
如果我也将列也提升为a / PK(又称为识别关系)会怎样?由于该列现在是PK,因此我必须用标记@Id:
@Id
@Id @ManyToOne @JoinColumn(name = "...") private OtherClass oc;
现在的问题是:
是@Id+ @JoinColumn上面一样@PrimaryKeyJoinColumn?
@ManyToOne @PrimaryKeyJoinColumn(name = "...") private OtherClass oc;
如果没有,那@PrimaryKeyJoinColumn有什么用?
如果我也将列也提升为a / PK(又称为识别关系)会怎样?由于该列现在是PK,因此必须使用@Id(…)对其进行标记。
对 派生标识符的 增强支持实际上是JPA2.0中新内容的一部分(请参阅JPA 2.0规范中的 2.4.1与派生身份相对应的主键部分),JPA1.0不允许Id在OneToOne或上使用ManyToOne。在JPA 1.0中,您必须使用外键列PrimaryKeyJoinColumn并Basic Id为其定义一个映射。
Id
OneToOne
ManyToOne
PrimaryKeyJoinColumn
Basic
现在的问题是:@Id + @JoinColumn与@PrimaryKeyJoinColumn是否相同?
您可以获得类似的结果,但是使用Idon OneToOne或ManyToOne则 简单得多 ,这是使用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。
该PrimaryKeyJoinColumn批注指定用作外键加入到另一个表的主键列。
的PrimaryKeyJoinColumn注释用于连接在一个实体子类的主表JOINED 映射策略到它的父类的主表; 它在 SecondaryTable注释中用于将辅助表连接到主表;并且可以OneToOne 在其中将引用实体的主键用作被引用实体的外键的映射中使用[108]。
JOINED
SecondaryTable
…
如果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的一部分。
为了记录在案,支持Id上OneToOne和ManyToOne已经在1.1的EclipseLink增加(见此消息来自詹姆斯·萨瑟兰,的EclipseLink comitter和的主要贡献者的Java Persistence维基书)。但是让我坚持,这 不是 JPA 1.0的一部分。