【Hibernate步步為營】--單向關聯一對一映射(一)

來源:互聯網
上載者:User

標籤:style   blog   class   code   c   java   

       上篇文章對多對一的關聯映射做了詳細的分析,它在實現上可以有兩種方式,並且這兩種方式實現也很簡單,關鍵是標籤<many-to-one>的使用,它分別指明了多端和一端的映射關係,這種映射關係既是物件模型中的彙總關係。接下來繼續討論關聯映射。

一、唯一外鍵

        唯一外鍵說的是資料庫表中的每一行的外鍵唯一對應著另一張表中的主鍵,也就是說一個表的主鍵作為另一張表的外鍵,並且它們之間的關係是唯一的,這種反應到關聯式模式中如所示:


       的兩個實體表,分別為人和身份證,很明顯的一個人對應著一個身份證。身份證作為一個單獨的實體表它添加了識別欄位,而且此識別欄位是人實體表中的外鍵先關聯。這種在實現上類似於上篇文章中講到的多對一映射,一個表的主鍵識別欄位是另一張表的外鍵,所在在實現時使用的也應該是<many-to-one>標籤,但不同的是這裡採用的是唯一對應,此時應該設定其它的屬性來做唯一標識。

        為了實現一對一的唯一外鍵映射,這時就必須在<many-to-one>標籤中添加上屬性unique,也就是指定多的一端的unique值為true,反應到該樣本中也就是在person的對應檔中設定一個<many-to-one name="idCard">標籤,並且標籤中需要添加unique="true",所以對應的Person.java的對應檔Person.hbm.xml的代碼如下:

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- Generated 2014-5-15 23:47:00 by Hibernate Tools 3.4.0.CR1 --><hibernate-mapping>    <class name="com.hibernate.Person" table="PERSON">        <id name="id" type="int">            <generator class="native"/>        </id><property name="name"></property><many-to-one name="idCard" unique="true"></many-to-one>    </class></hibernate-mapping>

       對比多對一關聯映射和一對一唯一外部索引鍵關聯映射,其實它們兩個都是使用了<many-to-one>本質上都是外鍵約束,只不過一對一的是唯一映射,需要添加unique="true"的屬性,其它的它們兩個是相同的。


二、主鍵關聯映射


        上文討論了一對一的唯一外鍵映射,它其實是多對一關聯映射的一種特殊情況,並且在關聯映射中會有多種情況,這裡再繼續討論關聯映射可能的情況。
        在一對一的關聯映射中會有一種特殊的情況就是一個表的主鍵同時也是一個表的外鍵,也就是說一個欄位是同是主鍵和外鍵,並且該外鍵唯一對應著另一張表的一行,它們兩個是唯一對應的關係,反應到物件模型中它們之間屬於一種一對一的參考關聯性,一個對象的屬性是另外一個對象的屬性值,物件模型如所示:

        的Person類和IdCard類之間是一一對應的關係,一個人就只能有一個身份證,一個身份證只能對應一個人,並且身份證的標識同時也是人的標識,它所對應的關聯式模式也是一種一對一的關係,一張的主鍵也是這張表的外鍵,如所示:

        T_person表的主鍵id列同時也是T_idCard表的主鍵識別欄位,這就構成了外鍵關係,所以此時它們之間就是一種一對一的主鍵關聯關係,那麼反應到Hibernate中是如何?的呢?
        Hibernate提供的這種映射關聯中不但有<many-to-one>的關係,另外還提供了<one-to-one>的關係,它既是指一對一的關係。
        在實現時需要將識別欄位設定為foreign,並將需要關聯的對象的名稱作為property參數寫入到構造器中,並在最後添加<one-to-one>標籤。具體代碼如下:

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- Generated 2014-5-15 23:47:00 by Hibernate Tools 3.4.0.CR1 --><hibernate-mapping>    <class name="com.hibernate.Person" table="PERSON">        <id name="id" type="int">        <!-- 採用foreign建置原則,foreign會取得關聯對象的標識 -->            <generator class="foreign">            <!-- property只關聯對象 -->            <param name="property">idCard</param>            </generator>        </id><property name="name"></property><!-- one-to-one標籤指示Hibernate如何載入其關聯對象,預設根據主鍵載入,也就是拿到關係欄位值,根據對端的主鍵來載入關聯對象constrained=true表示當前主鍵(person的主鍵)還是一個外鍵,參照了對端的主鍵(IdCard的主鍵),也就是會產生外鍵約束語句 --><one-to-one name="idCard" constrained="true"></one-to-one>    </class></hibernate-mapping>

        上面的樣本中的<param name="property">idCard</param>指的是在Person.java中有一個idCard的屬性,該屬性是Person對象的一個關聯對象,所以需要註冊到foreign中,取得關聯對象的標識。另外在<one-to-one>標籤中添加了一個屬性constrained="true",指示了Person對象的主鍵同時又是一個外鍵。具體的Person.java中的代碼如下:

package com.hibernate;public class Person {private IdCard idCard;public IdCard getIdCard() {return idCard;}public void setIdCard(IdCard idCard) {this.idCard = idCard;}private int id;public int getId() {return id;}public void setId(int id) {this.id = id;}private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}}

     其中的idCard是Person對象的一個屬性,所以在一對一主鍵關聯映射時需要添加一個識別欄位。


結語

      上文介紹了兩種一對一的映射,並且分別從物件模型和關聯式模式上進行了討論,對於唯一外鍵的映射來說它是多對一映射的一種特殊情況,只需要在<many-to-one>中添加unique唯一鍵即可,另外還有唯一主鍵映射,這種其實需要<one-to-one>標籤,然後在主鍵的屬性中使用foreign建置原則,並在該映射中添加對應的關聯對象。一對一的映射是還有很多種情況,將會在接下來的文章中討論。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.