2011-05-02 16 views
2

我剛剛發現JPA不支持非主鍵列的正式關係/外鍵。在這裏看到:JPA提供者:爲什麼在Hibernate和EclipseLink中關係/ FK到非PK列工作?

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

爲什麼這種關係在地圖和Hibernate的EclipseLink nontheless(僅在JPA 1.0語法作爲例子貼有)?

看來,這些JPA提供者只是天真地映射列,我認爲這是一件好事,但我想明確地知道。這是巧合嗎?它的目的是?

回答

1

EclipseLink/TopLink總是允許外鍵有意地指向任何表字段,因爲對象的主鍵並不一定需要是表上使用的pks--任何唯一標識符都可以。

只是猜測,但使用主鍵可能是JPA規範確保強制實施唯一標識符的一種方式,而不使用pk也有其他性能影響,因爲緩存/對象標識通常只會完成使用主鍵 - 這可能會導致額外的數據庫命中。 FK的

1

支持引用非PK列是一個可選功能(它總是如此,因此不存在「JPA 1.0語法」,我以前的答案是不正確的):

支持引用不是被引用表的主鍵列的列是可選的。 使用這種映射的應用程序將不可移植。

當然,Hibernate supports it

它有一個名爲referencedColumnName一個多個參數。該參數聲明將用於連接的目標實體中的列。請注意,在將referencedColumnName用於非主鍵列時,關聯的類必須是Serializable。另請注意,referencedColumnName到非主鍵列必須映射到具有單列的屬性(其他情況可能不起作用)。

雖然已經發現,這種關係不能用作溺愛身份的一部分。

+0

我用Hibernate和EclipseLink做了一些關於非PK關係的實驗。您可以看到每個JPA提供程序在這裏如何映射它們:http://www.kawoolutions.com/Technology/JPA,_Hibernate,_and_Co./Non-Primary_Key_Relationships – Kawu 2011-05-12 09:36:51

+0

關鍵是,Hibernate 3.6當前還支持多列非易失性存儲, PK關係(我喜歡)。 – Kawu 2011-05-12 09:41:17

+0

任何想法爲什麼它不適合我(JPA 2,Hibernate 3.6.10? - > http://stackoverflow.com/questions/29670105/jpa-onetoone-relation-on-non-primary-key-field-未工作 – codependent 2015-04-16 13:06:08

相關問題