Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 三大框架SSH成長路程(六)

三大框架SSH成長路程(六)

編輯:關於Android編程

一對一雙向關聯映射(六)

上篇博文一對一單向關聯映射(五),我們介紹了一對一的單向關聯映射,單向是指只能從人(Person)這端加載身份證端(IdCard),但是反過來,不能從身份證端加載人得信息。如圖所示:

關鍵原因在於對象模型具有方向性:
單向:一端只能加載另一端,不能反過來。
雙向:兩端都可以加載另一端。
問題來了:如何我們想從身份證端(IdCard)加載人(Person),怎麼辦呢?
下面我們開始介紹一對一的雙向關聯映射。

映射原理

   雙向關聯映射與單向關聯映射的原理是一樣的,雙向關聯映射並不影響存儲,只影響加載。所以,雙向關聯映射和單向關聯映射的關系模型是一樣的即數據庫的表結構是一樣的,只是IdCard的實體類和配置文件(IdCard.hbm.xml)發生了一點點變化。

對象模型

從上圖中可以看出:
1、一個人只有一張身份證,唯一的一個身份證號,對象之間是一對一的關系;
2、兩個對象得關系維護還是由person端決定(因為關系只能由一端維護主鍵,否則關系就亂了)。

   根據上面的對象模型,我們可以看到Person端沒有變化,但是要在IdCard端加上Person的引用,例如Person和IdCard實體類如下。

Person

package com.liang.hibernate;  

public class Person {  
    private int id;  
    private String name;  
    private IdCard idCard;  

    public IdCard getIdCard() {  
        return idCard;  
    }  
    public void setIdCard(IdCard idCard) {  
        this.idCard = idCard;  
    }  
    public int getId() {  
        return id;  
    }  
    public void setId(int id) {  
        this.id = id;  
    }  
    public String getName() {  
        return name;  
    }  
    public void setName(String name) {  
        this.name = name;  
    }  
}  

IdCard

package com.liang.hibernate;  

public class IdCard {  
    private int id;  
    private String cardNo;  
    private Person person;  

    public Person getPerson() {  
        return person;  
    }  
    public void setPerson(Person person) {  
        this.person = person;  
    }  
    public int getId() {  
        return id;  
    }  

    public void setId(int id) {  
        this.id = id;  
    }  
    public String getCardNo() {  
        return cardNo;  
    }  
    public void setCardNo(String cardNo) {  
        this.cardNo = cardNo;  
    }  
}  

無論是單向關聯映射還是雙向關聯映射,他們都屬於一對一關聯映射,只是他們主鍵的生成策略不同,分為主鍵關聯映射和唯一外鍵關聯映射。
由於它們都屬於一對一關聯映射,所以,Hibernate封裝雙向關聯映射時,主鍵關鍵映射和唯一外鍵關聯映射的加載策略一樣,都采用的是一對一,只是屬性設置不一致,所以,下面我們分開來看IdCard的配置文件。

分類:

主鍵關聯映射

 同一對一單向關聯映射類似,主鍵關聯即利用主鍵進行關聯,關聯主鍵的值相同。下面我們看一下映射文件:

IdCard.hbm.xml

  
  
  
      
          
              
          
          
          
          
      
  

Person.hbm.xml,同一對一單向主鍵關聯映射一樣

  
  
  
      
          
          
            idCard  
              
          
          
          
          
      
  

生成的表結構

唯一外鍵關聯映射

   一對一雙向關聯映射的外鍵關聯映射也與一對一單向關聯映射的外鍵關聯映射類似,在其一對一的指向端(Person)存在一個唯一外鍵,該唯一外鍵與被指向端(IdCard)相關聯,關聯主鍵的值相同。下面我們看一下映射文件:

IdCard.hbm.xml

  
  
  
      
          
              
          
          
          
          
      
  

Person.hbm.xml,同一對一單向唯一外鍵關聯映射一樣

  
  
  
      
          
              
          
          
          
          
              
      
  

生成的表結構

對比

   一對一單向和雙向關聯映射的區別正是對象模型和關系模型的區別之一。

對象模型:有方向性。它到底是單向還是雙向是由對象模型決定的即配置文件決定。
關系模型:沒有方向性或者說是雙向的。從任何一端都可以加載另一端。

總結

   一對一雙向關聯映射並不是必須的,是由需求下決定的。如果沒有這樣的需求,用戶也沒有要求,系統也不需要,就沒有必要建立雙向的關聯映射。
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved