如果我也将该列也提升为a / PK(又称为识别关系)会怎样?由于该列现在是PK,因此我必须使用@Id(...)对其进行标记。
对派生标识符的增强支持实际上是JPA 2.0中新内容的一部分(请参阅JPA 2.0规范中的2.4.1与派生身份相对应的主键部分),JPA 1.0不允许Id
在OneToOne
或上使用ManyToOne
。在JPA 1.0中,您必须使用外键列PrimaryKeyJoinColumn
并Basic
Id
为其定义一个映射。
现在的问题是:@Id + @JoinColumn与@PrimaryKeyJoinColumn是否相同?
可以得到类似的结果,但使用Id
上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
。
也可以看看
此源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的一部分。
作为记录,在EclipseLink 1.1中添加了Id
onOneToOne
和的支持ManyToOne
(请参阅James Pertherland的此消息,James Sutherland是EclipseLink的发起者和Java Persistence Wiki书的主要贡献者)。但请允许我坚持,这不是JPA 1.0的一部分。