如果我也将列提升为 PK(也称为识别关系),会发生什么情况?由于该列现在是 PK,因此我必须使用 @Id (...) 对其进行标记。
这种对派生标识符的增强支持实际上是JPA 2.0 中新内容的一部分(请参阅JPA 2.0 规范中与派生标识符对应的 2.4.1 主键部分),JPA 1.0 不允许Id
使用OneToOne
or ManyToOne
。使用 JPA 1.0,您必须使用PrimaryKeyJoinColumn
并定义Basic
Id
外键列的映射。
现在的问题是:@Id + @JoinColumn 是否与 @PrimaryKeyJoinColumn 相同?
您可以获得类似的结果,但使用Id
on OneToOne
orManyToOne
更简单,并且是使用 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] 2.4.1.1 节中描述的派生 id 机制现在将优先
PrimaryKeyJoinColumn
于 OneToOne 映射情况。
也可以看看
此来源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 的一部分。
作为记录,EclipseLink 1.1中添加了对Id
onOneToOne
和 但让我坚持,这不是JPA 1.0 的一部分。ManyToOne