JPA提供者:为什么非PK列的关系/ FK可以在Hibernate和EclipseLink中运行?

时间:2011-05-02 09:44:15

标签: hibernate jpa eclipselink relationship

我刚刚发现JPA不支持正式关系/非主键列的外键。见这里:

Does the JPA specification allow references to non-primary key columns?

为什么这样的关系会在Hibernate和EclipseLink中映射(仅在JPA 1.0语法中,如在那里发布的示例中那样)??

看来这些JPA提供商只是天真地映射列,我认为这是一件好事,但我想明确地知道。这是巧合吗?这是打算吗?

2 个答案:

答案 0 :(得分:1)

EclipseLink / TopLink始终允许外键有意指向任何表字段,因为对象的主键不一定需要是表中使用的pks - 任何唯一标识符都可以。

只是猜测,但使用主键可能是JPA规范确保强制执行唯一标识符的一种方式,而不使用pk也会产生其他性能影响,因为缓存/对象标识通常只能使用主键 - 因此可能导致额外的数据库命中。

答案 1 :(得分:1)

支持引用非PK列的FK是一个可选功能(总是如此,因此没有“JPA 1.0语法”,我以前的回答是不正确的):

  

支持不是引用表的主键列的引用列是可选的。   使用此类映射的应用程序将无法移植。

然而,Hibernate supports it

  

它还有一个名为referencedColumnName的参数。此参数声明将用于连接的目标实体中的列。请注意,将referencedColumnName用于非主键列时,关联的类必须是Serializable。另请注意,非主键列的referencedColumnName必须映射到具有单个列的属性(其他情况可能不起作用)。

虽然已经发现,但这样的关系不能作为衍生身份的一部分。

相关问题