2010-05-06 79 views
15

如何在hibernate hbm文件中創建可選的一對一映射?例如,假設我有一個用戶和一個last_visited_pa​​ge表。用戶可能有也可能沒有last_visited頁面。這是我的當前的一一對一映射在HBM文件:Hibernate中可選的一對一映射

用戶類別:

<one-to-one name="lastVisitedPage" class="LastVisitedPage" cascade="save-update"> 

LastVisitedPage類別:

<one-to-one name="user" class="user" constrained="true" /> 

上面的例子不允許用戶創建誰沒有最後訪問過的頁面。新創建的用戶尚未訪問任何頁面。如何更改hbm映射以使userPrefs映射爲可選?

回答

12

據我所知,Hibernate不支持可選的一對一(請參閱HHH-2007),因此您必須改用not-null="false"來代替假冒many-to-one

0

如果用戶最多有一個last_visited頁面,則有兩種情況:

(一)某個給定用戶沒有last_visited頁,在這種情況下,不會有此用戶在last_visited_pa​​ge任何元組表()(b)某個給定的用戶只有一個last_visited頁面,在這種情況下,last_visited_pa​​ge表中的這個用戶只會有一個元組。

這應該使它明顯,用戶ID是你最後一次訪問過的頁面表的候選鍵。

而且這應該很明顯,你應該將該密鑰聲明給DBMS。

4

我有一個simliar問題,但使用註釋。谷歌把我帶到這裏,因此,如果任何人發現自己在同一sitatuions,這個工作對我來說:

http://opensource.atlassian.com/projects/hibernate/browse/ANN-725

如果你使用的註釋,你可以使用@NotFound(動作= NotFoundAction.IGNORE)註釋,以便您不會遇到異常。只要確保你的代碼檢查空值,因爲它現在可能不存在;-)

9

只是今天花大半天試圖做類似的事情,終於找到了以下解決方案(只是在情況下,這可能是有用的其他人)

@OneToOne 
@JoinColumn(name="ClassA_Id", referencedColumnName="ClassB_Id", nullable=true) 

希望,可以幫助節省的人一些時間

+2

只是一個供參考 - 此解決辦法有,如果你使用Envers(你會得到這個錯誤的問題:HTTPS://hibernate.onjira。 COM /瀏覽/ HHH-3853)。儘管Hibernate 3.6.8已經解決了可選的@OneToOne映射問題。 – Phyxx 2011-11-09 20:58:59