2010年9月29日 星期三

Hibernate 教學 - 雙向一對一 (雙向主鍵)

對於上一篇所提及的一對一當中,我們是以多對一的角度,並限制多的一芳外鍵唯一

即可達到一對一的效果,接下來簡單說明一下另外一個一對一的用法

想法即是讓多對一中,"一"的這一方的主鍵成為外來鍵,這樣多的這方即可不用再有外鍵關連到一的這方

以上一篇的例子來說明,Customer & Address (多對一)

即可以將 Customer 的外鍵 address_id 取消,並以 Address 的主鍵當做外鍵即可

那在這兩個類別的寫法都不變,同樣都是有關連到彼此的雙向關係

唯一不同的救是組態檔的設定,稍微來看一下

Customer.hbm.xml

<class name="MapPOJO.Customer" table="Customer">
      <id name="id" column="id">
             <generator class="native" />
      </id>
      //.....省略其他屬性.....
      <one-to-one name="address" class="MapPOJO.Address" cascade="all" />
</class>

Address.hbm.xml

<class name="MapPOJO.Address" table="Address">
      <id name="id" column="id">
             <generator class="foreign" >
                  <param name="property">customer</param>
             </generator>
      </id> 
      
      <one-to-one name="customer" class="MapPOJO.Customer"  
                                  constrained="true" />     
</class>


紅色字體的部分一定要加上去


Address 的主鍵定義成 foreign,意思是 id 即是主鍵也是外鍵


以上是一對一的主鍵關聯的寫法


至於再一對一當中如果不要寫成雙向關聯 也就是只要兩物件之間只有單向關係


以多對一的例子並以上一篇的寫法來看


我們只要將 "多" 的這一方在 many-to-one 標籤中 設定 unique="true"


即可讓該外鍵唯一,形成單向一對一的關係


不需要再增加 Address 的 one-to-one 標籤了


即是讓 Customer 有 reference 到 Address

沒有留言:

張貼留言