2014-02-14 37 views
3

根據書Pro JPA 2單向@ManyToOne和@OneToOne之間的主要區別在於,在@OneToOne:JPA單向@OneToOne vs @ManyToOne與休眠 - 沒有區別?

只有源實體的一個實例可以參考同一個目標實體實例。 換句話說,目標實體實例是 不在源實體實例之間共享。在數據庫中,這相當於對源外鍵列(即源實體表中的外鍵列)具有唯一性約束。

事情是,當我在實體上創建這樣的映射並讓Hibernate創建模式時,根本沒有創建任何獨特的約束。爲什麼?正因爲如此,如果我必須明確地爲映射定義唯一約束,@ManyToOne和@OneToOne之間沒有區別。我可以爲他們兩人做,而且沒有任何區別。這是正確的行爲嗎?

回答

5

如果關聯是ManyToOne,則沒有理由使用OneToOne,反之亦然。使用適當的註釋,它反映了關聯的基數的真實性。不這樣做只會混淆應用程序的開發人員,如果不是Hibernate本身。

源的唯一性是否限制在數據庫中並不會改變Hibernate的任何內容。根據我的經驗,休眠確實在OneToOne的情況下創建了唯一的約束,如果沒有,那麼您應該創建它(我不會使用Hibernate創建模式,除了快速'n dirty演示應用程序)。當然,如果存在唯一的約束,並且您嘗試使用相同的目標實體創建兩個不同的實體,則由於數據庫唯一約束拋出的錯誤而失敗。

+3

「不這樣做只會混淆應用程序的開發人員」 - 這是我能想到的最佳理由!你能指定使用@OneToOne創建約束的Hibernate版本嗎? – user1071076

+0

我最近使用過的一個,IIRC。 3.6及更高版本。它也可能取決於你的數據庫方言。 –

+0

嗯,Oracle XE,可能就是這樣。將檢查與MySQL ... – user1071076

3

該文本的重要部分是this equates to having a uniqueness constraint。它並不推斷JPA提供者會爲您在這兩個表上設置唯一的約束。它僅僅意味着在數據庫級別,一個表中的一行只會映射到另一個表中的一行。

One to OneOne to Many(關係的基數)之間存在顯着差異。在一個One To Many關係中意味着關係一方的實體可以映射(通過多方的外鍵)到關係多方的許多實體。在One to One關係中,實體只是映射到另一個單獨的實體。