1. 程式人生 > >Hibernate對映詳解--一對一唯一外來鍵關聯對映

Hibernate對映詳解--一對一唯一外來鍵關聯對映

  還記得多對一的那個例子嗎?使用者與組。我們在多的一端維護關係,最後生成的表格中,多的一端User中多出來一個欄位groupId用來儲存組的主鍵。這裡,多個使用者可以屬於同一組。即在使用者這個表中,groupId欄位的值是可以重複的。但有的時候可能這個外來鍵值是不可以重複的。比如仍然舉身份證與人的例子。我們可以採用上面的一對一主鍵關聯對映。當然,我們也可以在人的表中新增一個欄位身份證id來儲存資訊。但只是這樣還不夠,不同的人擁有相同的身份證號碼這是不允許的。那怎麼辦呢?一對一唯一外來鍵對映來給我們解決這個問題。先來看一下圖。

人與身份證的實體關係圖

最後生成表關係圖

下面來看具體程式碼的實現。

實體類實現:

      public  class Person {

privateintid;

private Stringname;

private IdCardidCard;//關聯物件

省略getset方法

}

       public class IdCard {

privateintid;

private StringcardNo;

省略getset方法

}

看一下對映檔案

Person.hbm.xml

<hibernate-mapping>

<classname="com.bjpowernode.hibernate.Person"

table="t_person">

<idname="id">

<generatorclass="native"/>

</id>

<propertyname="name"/>

<!--多對一關聯,但是後面加一個unique唯一的限定,則確保了關聯欄位取值的唯一性 -->

<many-to-onename="idCard"unique="true"/>

</class>

</hibernate-mapping>

IdCard.hbm.xml

<hibernate-mapping>

<

classname="com.bjpowernode.hibernate.IdCard"table="t_idCard">

<idname="id">

<generatorclass="native"/>

</id>

<propertyname="cardNo"/>

</class>

</hibernate-mapping>

        普通的實體類對映。從上面可以看出,一對一唯一外來鍵對映的重點就是Person一端的many-to-one標籤的設定。同一對一主鍵關聯對映一樣,看完單向之後,我們來看一下一對一唯一外來鍵對映的雙向關聯。同樣拿人與身份證進行舉例。

實體類實現

public class Person {

privateintid;

private Stringname;

private IdCardidCard//關聯屬性

省略getset方法

}

public class IdCard {

privateintid;

private StringcardNo;

private Personperson//關聯屬性

省略getset方法

}

對應的對映檔案:

Person.hbm.xml

<hibernate-mapping>

<classname="com.bjpowernode.hibernate.Person"table="t_person">

<idname="id">

<generatorclass="native"/>

</id>

<propertyname="name"/>

<many-to-onename="idCard"unique="true"/>

</class>

</hibernate-mapping>

IdCard.hbm.xml

<hibernate-mapping>

<class name="com.bjpowernode.hibernate.IdCard"table="t_idCard">

<idname="id">

<generatorclass="native"/>

</id>

<propertyname="cardNo"/>

<!--property-ref為關係欄位的名稱 -->

<one-to-onename="person"property-ref="idCard"/>

</class>

</hibernate-mapping>

         一對一唯一外來鍵關聯對映雙向採用<one-to-one>標籤對映,而且是必須指定。這也是在對映檔案的實現上他們唯一的區別。