hibernate one-to-one

[from] http://bravefly.iteye.com/blog/232418

 

關鍵字: one-to-one

one-to-one在hibernate中可以用來作爲兩張表之間的主鍵關聯,這也是hibernate中主鍵關聯的一種用法,這樣在一張表中的ID,在生成另外一張表的同時回自動插入到相應的ID字段中去,相應的XML文件設置比較簡單,舉例如下:

<!-- 建立一對一的到Address的映射,這個是寫在User的XML配置文件中的 -->
<!-- 相應的User bean(PO)中也要添加屬性 com.xx.Address address-->
Java代碼 複製代碼
  1. <one-to-one name= "address"  cascade= "all"   class = "com.xx.Address" />  
<one-to-one name="address" cascade="all" class="com.xx.Address"/>

<!-- cascade的屬性設置不再重複了,可以查看hibernate文檔 -->

<!-- 建立一對一的到User的映射,這個是寫在Address的XML配置文件中的 -->
<!-- 相應的Address bean(PO)中也要添加屬性 com.xx.User user--> -->
Java代碼 複製代碼
  1. <one-to-one name= "user"   class = "com.xx.User"  constrained= "true" />  
<one-to-one name="user" class="com.xx.User" constrained="true"/>


constrained="true" 告訴Hibernate Address的PK還應該是一個FK,這個FK引用User的PK。爲了在Address中使用User中的主鍵ID值,我們需要設置Address中 的主鍵生成規則,如下所示,採用foreign關鍵字
Java代碼 複製代碼
  1. <id column= "ID"  name= "id"  type= "long"  unsaved-value= "0" >   
  2.    <generator class = "foreign" >  
  3.      <param name="property" >user</param>    
  4.    </generator>  
  5. </id>  
   <id column="ID" name="id" type="long" unsaved-value="0"> 
      <generator class="foreign">
        <param name="property">user</param>  
      </generator>
   </id>

這裏需要注意的是property的屬性值必須與上面到User的映射所填寫的name屬性值一致,這樣就完成了one-to-one的映射關係。 unsaved-value是表示一個對象是新的還是舊的,如果unsaved-value=none 那麼就是新的,就會被insert到數據庫中,如 果unsaved-value=any 就是說明對象是從數據庫中load的,被update到數據庫中

上面的過程都很簡單,下面我來說說這裏需要注意的地方:

1. 在設置屬性ID的時候必須注意字段的長度,如筆者這樣使用oracle的sequence來生成ID,其長度有14位之長,則應選擇hibernate類型long,對應的實體中應選擇Long,這樣不會出現溢出的情況。


2. 在測試的時候必須要注意這兩張表之間因爲已經存在了一對一的關係,所以我們不能只寫
user.setAddress(address);
而忽略了
address.setUser(user);
這樣在做插入的時候會報出attempted to assign id from null one-to-one property: address的錯誤,這一點初學者會經常犯,筆者也是其中之一。


3. 如果不寫cascade="all"或者寫成cascade="none"的話,即使你寫了
user.setAddress(address);
address.setUser(user);
也不會發生任何事情,只有user會被存儲。

以上是一點點小經驗,如果有不對的地方歡迎指正。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章