Hibernate映射——一對一單向關聯映射(五)

映射原理

 

      兩個實體對象之間是一對一的關聯映射,即一個對象只能與另外惟一的一個對象相對應。例如:一我的(Person)只有一張身份證(IdCard)。咱們看一下這個例子的對象模型,以下圖所示:html

 

對象模型

 

       

        從上圖中能夠看出:java

        一、一我的只有一張身份證,惟一的一個身份證號,對象之間是一對一的關係;app

        二、人(Person)持有身份證(IdCard)的引用,因此,兩個對象關係維護由person端決定。測試

        從對象模型映射成關係模型,有兩種方式:主鍵關聯和惟一外鍵關聯,咱們繼續看下面的內容。this

 

分類: 

 

 主鍵關聯:

 

        一、兩個實體對象的主鍵同樣,以代表它們之間的一一對應關係;spa

        二、不須要多餘的外鍵字段來維護關係,僅經過主鍵來關聯,即Person的主鍵要依賴IdCard的主鍵,他們共用一個主鍵值。.net

        以上兩點恰與惟一外鍵關聯相反。hibernate

 

 主鍵關聯的關係模型xml

 Person.hbm.xmlhtm

[html] view plain copy

  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5. <hibernate-mapping package="com.liang.hibernate">  
  6.     <class name="Person" table="t_person">  
  7.         <id name="id">  
  8.         <!-- 採用foreign生成策略,forgeign會取得另一個關聯對象的標識 -->  
  9.             <generator class="foreign" >  
  10.                 <param name="property">idCard</param>  
  11.             </generator>  
  12.         </id>  
  13.         <property name="name"></property>  
  14.         <!--   
  15.             one-to-one指示hibernate如何加載其關聯對象,默認根據主鍵加載  
  16.             也就是拿到關係字段值,根據對端的主鍵來加載關聯對象  
  17.               
  18.             constrained="true"表示約束,當前主鍵(person的主鍵)仍是一個外鍵  
  19.             參照了對端的主鍵(IdCard的主鍵),也就是會生成外鍵約束語句  
  20.          -->  
  21.          <!-- idCard屬性,表達的是本對象與IdCard的一對一關係。 -->  
  22.         <one-to-one name="idCard" class="IdCard"  constrained="true"></one-to-one>  
  23.     </class>  
  24. </hibernate-mapping>  

生成的表結構以及測試數據:

 

惟一外鍵關聯:

 

       一、兩個實體對象用一個外鍵來關聯,以表代表對象之間的關係。

       二、其實它是多對一關聯映射的特例,多的一端加上惟一的限制以後,用來表示一對一的關聯關係。

       因此它採用多對一的標籤來映射,以下所示:

[html] view plain copy

  1. <!-- 採用<mang-to-one>標籤來映射,指定多的一端unique爲true,  
  2.     這樣就限制了多的一端的多重性爲一,就是這樣來映射的。  
  3. -->  
  4. <many-to-one name="" unique="true"></many-to-one>  

惟一外鍵的關係模型

Person.hbm.xml

[html] view plain copy

  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5. <hibernate-mapping package="com.liang.hibernate">  
  6.     <class name="Person" table="t_person">  
  7.         <id name="id">  
  8.             <generator class="native" ></generator>  
  9.         </id>  
  10.         <property name="name"></property>  
  11.         <!-- 因爲它是一對一的惟一外鍵關聯,它是多對一關聯的特例,註釋能夠直接寫成多對一關聯-->  
  12.         <!-- idCard屬性,表達的是本對象與IdCard的多對一關係。 -->  
  13.         <many-to-one name="idCard" class="IdCard" column="idCardId" unique="true"></many-to-one>      
  14.     </class>  
  15. </hibernate-mapping>  

生成的表結構以及測試數據:

 

 

其餘相同代碼以下:

Person

[java] view plain copy

  1. public class Person {  
  2.     private int id;  
  3.     private String name;  
  4.     private IdCard idCard;  
  5.       
  6.     public IdCard getIdCard() {  
  7.         return idCard;  
  8.     }  
  9.     public void setIdCard(IdCard idCard) {  
  10.         this.idCard = idCard;  
  11.     }  
  12.     public int getId() {  
  13.         return id;  
  14.     }  
  15.     public void setId(int id) {  
  16.         this.id = id;  
  17.     }  
  18.     public String getName() {  
  19.         return name;  
  20.     }  
  21.     public void setName(String name) {  
  22.         this.name = name;  
  23.     }  
  24. }  

IdCard

[java] view plain copy

  1. public class IdCard {  
  2.     private int id;  
  3.     private String cardNo;  
  4.     public int getId() {  
  5.         return id;  
  6.     }  
  7.     public void setId(int id) {  
  8.         this.id = id;  
  9.     }  
  10.     public String getCardNo() {  
  11.         return cardNo;  
  12.     }  
  13.     public void setCardNo(String cardNo) {  
  14.         this.cardNo = cardNo;  
  15.     }  
  16. }  

IdCard.hbm.xml

[html] view plain copy

  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5. <hibernate-mapping package="com.liang.hibernate">  
  6.     <class name="IdCard" table="t_idCard">  
  7.         <id name="id">  
  8.             <generator class="native"></generator>  
  9.         </id>  
  10.         <property name="cardNo"></property>  
  11.     </class>  
  12. </hibernate-mapping>  

建議

 

因爲一對一主鍵關聯映射具備如下兩個缺點:

      一、靈活性差,沒有辦法改爲多對一關聯映射,不能應變多變的需求;

      二、必須先保存關聯對象IdCard,以後才能保持Person;

因此,在映射一對一單向關聯映射時,咱們採用惟一外鍵關聯映射。

相關文章
相關標籤/搜索