【Hibernate】從入門到精通(五)關聯映射之一對一映射

我們在之前的博客中已經有講到什麼是Hibernate的對象關係映射。
在實現ORM功能的時候,主要用到的文件有:

主要部分:

映射類(*.java)

實際上就是我們用的對象類。類裏的屬性被映射爲表中的字段。

映射文件(* .hbm.xml)

指定了映射類和數據庫之前的關係。包括映射類和數據庫表的對應關係。表字段和類屬性類型的對應關係以及表字段和類屬性名稱的對應關係等。

配置文件(*.properties/.cfg.xml)

指定與數據庫連接時需要的連接信息。
通過之前從入門到精通(三)映射實體類 博客,應該都對上面的三個文件不陌生。那麼本篇博客,我們還是基於這三個文件來具體看一下各個不同的映射關係都是怎麼實現的。
首先,關係映射的種類如下:
這裏寫圖片描述

也即是上面七種關係。本篇博客我們介紹一對一關聯映射。

一對一關聯映射

兩個對象之間一對一的關係,舉例Person-IdCard
一個人只能有一張身份證,一張身份證也只能對應一個人。也意味着在每個person對象中都會引用一個IdCard對象。在具體業務中,如果僅有person到IdCard的關聯,或者僅有IDCard到Person的關聯,就稱之爲單項關聯。如果同時包含兩種關聯映射,則成爲雙向關聯映射。

一)單項一對一關聯映射

實現策略

有兩種策略可以實現:

主鍵關聯:

即讓兩個對象有相同的主鍵值。以表明它們之間的一一對應關係。數據庫表僅通過表的主鍵來維護,不需要額外的字段。
這裏寫圖片描述

具體實現:

    <hibernate-mapping>  
        <class name="com.example.hibernate.IdCard" table="t_idCard">  
            <id name="id">  
                <generator class="native"/>  
            </id>  
            <property name="cardNo"/>  
        </class>  
    </hibernate-mapping>  
    <hibernate-mapping>  
        <class name="com.example.hibernate.User" table="t_person">  
            <id name="id">  
                <!-- 採用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>  

注意:假如當前需要將其變爲一對多的時候,就無法操作了。因此它的擴展映射性並不好。通常會採用下面這種唯一外鍵關聯的辦法來解決問題。

唯一外鍵關聯

採用標籤來映射,指定多的一端unique爲true,因爲unique=true是指這個字段的值在這張表裏不能重複,所有記錄值都要唯一,所以這樣就限制了多的一段的多重性爲一。(實際上不加unique=true的限制,正好是用於多對一的配置)

這裏寫圖片描述
具體實現:

    <hibernate-mapping>  
        <class name="com.example.hibernate.Person" table="t_person">  
            <id name="id">  
                <generator class="native"/>  
            </id>  
            <!-- property指關聯對象 --> 
            <property name="name"/>  
            <!-- 默認參考idCard的主鍵-->  
            <many-to-one name="idCard" unique="true"/>  
        </class>  
    </hibernate-mapping>  
<hibernate-mapping>  
    <class name="com.example.hibernate.IdCard" table="t_idCard">  
        <id name="id">  
            <generator class="native"/>  
        </id>  
        <property name="cardNo"/>  
    </class>  
</hibernate-mapping> 

備註:一對一唯一外鍵關聯映射其實就是多對一的特例。

二)雙向一對一關聯映射

實現策略

主鍵映射

採用標籤映射

    <one-to-one name="person"/>  

唯一外鍵映射

採用one - to-one>標籤映射,並需指定其中的property-ref屬性爲關係字段的名稱。

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

總結:

以上,我們就將Hibernate中非常重要的一對一的關聯映射介紹完了。
下篇博客會繼續總結關聯映射的其他幾種映射關係。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章