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)複雜寫法: