Hibernate對象關系映射—-關聯映射(二) – JAVA編程語言程序開發技術文章

一對一主鍵關聯映射(單向Person—->IdCard)
  原理:讓兩個實體的主鍵一樣,這樣就不需要加入多餘的字段瞭。
  舉例:一個人(Person)擁有一張身份證(IdCard)。

Person類的映射文件Person.hbm.xml。
[html]
<hibernate-mapping> 
    <class name="com.snail.hibernate.Person" table="t_person"> 
        <id name="id"> 
            <!– 采用foreign生成策略,foreign會取得關聯對象的標識 –> 
            <generator class="foreign"> 
                <!– property隻關聯對象 –> 
                <param name="property">idCard</param> 
            </generator> 
        </id> 
        <property name="name"/> 
        <one-to-one name="idCard" constrained="true"/> 
    </class> 
</hibernate-mapping> 
  從對象模型中看,Person類持有IdCard的引用。從配置看,<one-to-one>指示hibernate如何加載關聯對象,默認根據主鍵加載,也就是拿到關系字段值,根據對端的主鍵來加載關聯對象。Constrained=”true”表示,當前主鍵(person的主鍵)還是一個外鍵,參照瞭對端的主鍵(IdCard的主鍵),也就是會生成外鍵約束語句。
一對一主鍵關聯映射(雙向Person<—->IdCard)
  原理:與上面單項相同,隻是需要兩端都需要維護。
  舉例:同上。

 Person的映射文件不變,和上面相同。IdCard的映射文件IdCard.hbm.xml。
[html]
<hibernate-mapping> 
    <class name="com.snail.hibernate.IdCard" table="t_idCard"> 
        <id name="id"> 
            <generator class="native"/> 
        </id> 
        <property name="cardNo"/> 
        <one-to-one name="person"/> 
    </class> 
</hibernate-mapping> 
 在對象模型中,Person和IdCard各自都持有對方的引用,在配置方面,需要在IdCard加入<one-to-one>標簽,隻是hibernate將關聯對象Person根據主鍵加載上來。<one-to-one>不影響存儲,隻影響加載。
一對一唯一外鍵關聯映射(單向Person—->IdCard)
       原理:一對一唯一外鍵關聯映射其實是多對一的特例,因此和上篇講過的原理相同。
       舉例:同上。


 

Person對象映射文件Person.hbm.xml。
[html]
<hibernate-mapping> 
    <class name="com.snail.hibernate.Person" table="t_person"> 
        <id name="id"> 
            <generator class="native"/> 
        </id> 
        <property name="name"/> 
 
        <many-to-one name="idCard" unique="true"/> 
    </class> 
</hibernate-mapping> 
采用<many-to-one>標簽來映射,指定多的一端unique為true,這樣就限制瞭多的一端的多重性為一。
一對一唯一外鍵關聯映射(雙向Person<—->IdCard)
  原理:同上。
       舉例:同上。

  
     Person映射文件不變,和上面相同。IdCard的映射文件IdCard.hbm.xml。
[html] 
<hibernate-mapping> 
    <class name="com.snail.hibernate.IdCard" table="t_idCard"> 
        <id name="id"> 
            <generator class="native"/> 
        </id> 
        <property name="cardNo"/> 
        <one-to-one name="person" property-ref="idCard"/> 
    </class> 
</hibernate-mapping> 
         從對象模型看,雙方都各自持有對方的引用。從配置看,一對一唯一外鍵關聯雙向采用<one-to-one>標簽映射,必須指定<one-to-one>標簽中的property-ref屬性為關系字段的名稱,它表示本類(IdCard)的主鍵將會與關聯類(Person)的此屬性(idCard)相對應。
多對多關聯映射(單向User—->Role)
   原理:一般的設計中,多對多關聯映射,需要一個中間表,將兩個表中的主鍵放到中間表中做一個關聯。
   舉例:一個用戶(User)對多個角色(Role),一個角色對多個用戶。

       User對象的映射文件User.hbm.xml。
[html] 
<hibernate-mapping package="com.snail.hibernate"> 
    <class name="User" table="t_user"> 
        <id name="id"> 
            <generator class="native"/> 
        </id> 
        <property name="name"/> 
        <set name="roles" table="t_user_role"> 
            <key column="user_id"/> 
            <many-to-many class="Role" column="role_id"/> 
        </set> 
    </class> 
</hibernate-mapping> 
         多對多的關聯映射,在實體類中,跟一對多一樣,也是用集合來表示的。<set>標簽中用table屬性重命名中間表名稱,<key>標簽定義當前表的主鍵,用<many-to-many>標簽來關聯另一張表。
多對多關聯映射(雙向User<—->Role)
        原理:同上。
        舉例:同上。


 
       User對象的映射文件和上面相同。Role的映射文件Role.hbm.xml。
[html] 
<hibernate-mapping package="com.snail.hibernate"> 
    <class name="Role" table="t_role"> 
        <id name="id"> 
            <generator class="native"/> 
        </id> 
        <property name="name"/> 
        <set name="users" table="t_user_role"> 
            <key column="role_id"/> 
            <many-to-many class="User" column="user_id"/> 
        </set> 
    </class> 
</hibernate-mapping 
          多對多雙向關系中,User和Role的映射文件相同,值得註意的是生成的中間表名稱必須一樣,生成中間表的字段必須一樣。
         關聯關系到此就結束瞭,咋一看Hibernate的關聯關系一大堆,搞得人發暈,但是把這些歸納起來,並分類匯總理解就非常簡單瞭。
作者:StubbornPotatoes

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *