1. 程式人生 > >Hibernate一對多及多對多操作

Hibernate一對多及多對多操作

表與表之間關係回顧(重點)

  1 一對多

    (1)分類和商品關係,一個分類裡面有多個商品,一個商品只能屬於一個分類

 

    (2)客戶和聯絡人是一對多關係

      - 客戶:與公司有業務往來,百度、新浪、360

      - 聯絡人:公司裡面的員工,百度裡面有很多員工,聯絡員工

      ** 公司和公司員工的關係

 

      - 客戶是一,聯絡人是多

      - 一個客戶裡面有多個聯絡人,一個聯絡人只能屬於一個客戶

 

    (3)一對多建表:通過外來鍵建立關係

 

  2 多對多

    (1)訂單和商品關係,一個訂單裡面有多個商品,一個商品屬於多個訂單

 

    (2)使用者和角色多對多關係

      - 使用者: 小王、小馬、小宋

      - 角色:總經理、祕書、司機、保安

      ** 比如小王 可以 是總經理,可以是司機

      ** 比如小宋 可以是司機,可以是祕書,可以保安

      ** 比如小馬 可以是 祕書,可以是總經理

      -          一個使用者裡面可以有多個角色,一個角色裡面可以有多個使用者

 

    (3)多對多建表:建立第三張表維護關係

 

 

  3 一對一

    (1)在中國,一個男人只能有一個妻子,一個女人只能有一個丈夫

 

Hibernate的一對多操作(重點)

  一對多對映配置(重點)

 

    以客戶和聯絡人為例:客戶是一,聯絡人是多

 

    第一步 建立兩個實體類,客戶和聯絡人

 

    第二步 讓兩個實體類之間互相表示

      (1)在客戶實體類裡面表示多個聯絡人

        - 一個客戶裡面有多個聯絡人

public class Customer {
    //客戶id
    private Integer cid;
    
//客戶名稱 private String custName; //客戶級別 private String custLevel; //客戶來源 private String custSource; //聯絡電話 private String custPhone; //手機 private String custMobile; //在客戶實體類裡面表示多個聯絡人,一個客戶有多個聯絡人 //hibernate要求使用集合表示多的資料,使用set集合 private Set<LinkMan> setLinkMan; public Set<LinkMan> getSetLinkMan() { return setLinkMan; } public void setSetLinkMan(Set<LinkMan> setLinkMan) { this.setLinkMan = setLinkMan; } public Integer getCid() { return cid; } public void setCid(Integer cid) { this.cid = cid; } public String getCustName() { return custName; } public void setCustName(String custName) { this.custName = custName; } public String getCustLevel() { return custLevel; } public void setCustLevel(String custLevel) { this.custLevel = custLevel; } public String getCustSource() { return custSource; } public void setCustSource(String custSource) { this.custSource = custSource; } public String getCustPhone() { return custPhone; } public void setCustPhone(String custPhone) { this.custPhone = custPhone; } public String getCustMobile() { return custMobile; } public void setCustMobile(String custMobile) { this.custMobile = custMobile; } }

 

      (2)在聯絡人實體類裡面表示所屬客戶

        - 一個聯絡人只能屬於一個客戶

public class LinkMan {
    
    private Integer lkm_id; // 聯絡人編號(主鍵)
    private String lkm_name;// 聯絡人姓名
    private String lkm_gender;// 聯絡人性別
    private String lkm_phone;// 聯絡人辦公電話
    
    // 在聯絡人實體類裡面表示所屬客戶,一個聯絡人只能屬於一個客戶
    private Customer customer;
    
    public Customer getCustomer() {
        return customer;
    }
    public void setCustomer(Customer customer) {
        this.customer = customer;
    }
    public Integer getLkm_id() {
        return lkm_id;
    }
    public void setLkm_id(Integer lkm_id) {
        this.lkm_id = lkm_id;
    }
    public String getLkm_name() {
        return lkm_name;
    }
    public void setLkm_name(String lkm_name) {
        this.lkm_name = lkm_name;
    }
    public String getLkm_gender() {
        return lkm_gender;
    }
    public void setLkm_gender(String lkm_gender) {
        this.lkm_gender = lkm_gender;
    }
    public String getLkm_phone() {
        return lkm_phone;
    }
    public void setLkm_phone(String lkm_phone) {
        this.lkm_phone = lkm_phone;
    }
    
}

    第三步 配置對映關係

      (1)一般一個實體類對應一個對映檔案

      (2)把對映最基本配置完成

 

      (3)在對映檔案中,配置一對多關係

        - 在客戶對映檔案中,表示所有聯絡人

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    
<hibernate-mapping>

    <class name="com.wm.onetomany.Customer" table="t_customer">
    
        <id name="cid" column="cid">
            <generator class="native"></generator>
        </id>
        
        <property name="custName" column="custName"></property>
        <property name="custLevel" column="custLevel"></property>
        <property name="custSource" column="custSource"></property>
        <property name="custPhone" column="custPhone"></property>
        
        <!-- 在客戶對映檔案中,表示所有聯絡人 
            使用set標籤表示所有聯絡人
            set標籤裡面有name屬性:
                 屬性值寫在客戶實體類裡面表示聯絡人的set集合名稱
                 
             inverse屬性預設值:false不放棄關係維護
                            true表示放棄關係維護
        -->
        <set name="setLinkMan">
            <!-- 一對多建表,有外來鍵
                hibernate機制:雙向維護外來鍵,在一和多那一方都配置外來鍵    
                column屬性值:外來鍵名稱
             -->
            <key column="clid"></key>
            <!-- 客戶所有的聯絡人,class裡面寫聯絡人實體類全路徑 -->
            <one-to-many class="com.wm.onetomany.LinkMan" />
        </set>
        
    </class>
    
</hibernate-mapping>    

      - 在聯絡人對映檔案中,表示所屬客戶

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    
<hibernate-mapping>

    <class name="com.wm.onetomany.LinkMan" table="t_linkman">
    
        <id name="lkm_id" column="lkm_id">
            <generator class="native"></generator>
        </id>
        
        <property name="lkm_name" column="lkm_name"></property>
        <property name="lkm_gender" column="lkm_gender"></property>
        <property name="lkm_phone" column="lkm_phone"></property>
        
        <!-- 表示聯絡人所屬客戶 
            name屬性:因為在聯絡人實體類使用customer物件表示,寫customer名稱
            class屬性:customer全路徑
            column屬性:外來鍵名稱
        -->
        <many-to-one name="customer" class="com.wm.onetomany.Customer" column="clid"></many-to-one>
        
    </class>
</hibernate-mapping>

    第四步 建立核心配置檔案,把對映檔案引入到核心配置檔案中

 

  一對多級聯儲存   

    1 新增客戶,為這個客戶新增一個聯絡人

    (1)複雜寫法: