Hibernate框架學習筆記03

1.一對多|多對一

(1)關係表達

1.表中的表達

這裏寫圖片描述

2.實體中的表達

這裏寫圖片描述

3.orm元數據中表達
一對多:
<!-- 集合,一對多關係,在配置文件中配置 -->
<!-- name屬性:集合屬性名
     key屬性:外鍵列名
     class屬性:與我關聯的對象的完整列名 -->
<set name="linkMans" inverse="true" cascade="delete" >
    <key column="lkm_cust_id"></key>
    <one-to-many class="LinkMan"/>
</set>
多對一
<!-- 多對一 -->
<!-- name屬性:引用屬性名
     column屬性:外鍵列名
     class屬性:與我相關聯的對象的完整列名 -->
<many-to-one name="customer" column="lkm_cust_id" class="Customer" ></many-to-one>

(2)操作

1.操作關聯屬性
//保存客戶以及客戶下的聯繫人
Customer c = new Customer();
c.setCust_name("google");

LinkMan l1 = new LinkMan();
l1.setLkm_name("g11");
LinkMan l2 = new LinkMan();
l2.setLkm_name("g22");

//表達一對多,一個客戶下有多個聯繫人
c.getLinkMans().add(l1);
c.getLinkMans().add(l2);
//表達多對一,聯繫人屬於哪個客戶
l1.setCustomer(c);
l2.setCustomer(c);
//對象由瞬時態轉換爲持久態
session.save(c);
session.save(l1);
session.save(l2);

(3)進階操作

1.級聯操作
<!-- 級聯操作 cascade
     save-update:級聯保存更新
      delete:級聯刪除
      all;  save-update+delete
      級聯操作:簡化操作,目的是爲了少寫兩行代碼
-->
結論: 簡化操作.一定要用,save-update,不建議使用delete.
2.關係維護

這裏寫圖片描述
在保存時.兩方都會維護外鍵關係.關係維護兩次,冗餘了. 多餘的維護關係語句,顯然是客戶這一端在維護關係

<!-- inverse屬性:配置關係是否維護 
     true: customer不維護
     false:(默認) customer維護關係
     inverse屬性:性能優化,提高關係維護的性能
     原則:無論如何放棄,總有一方需要維護關係
     一對多關係中,一的一方放棄,也只能一的一方放棄,多的一方不能放棄,因爲外鍵字段在多的一方-->
<set name="linkMans" inverse="true" cascade="delete" >

2.多對多

(1)關係表達

1.表中表達

這裏寫圖片描述

2.實體中表達

這裏寫圖片描述

3.orm元數據中表達
<!-- 多對多關係表達 -->
<!-- name:集合屬性名
     table:配置中間表名
     key:column:外鍵,別人引用我的外鍵列名
     class:我與哪個類是多對多關係
     column:外鍵,我引用此人的外鍵列名 -->
<set name="roles" table="sys_user_role" cascade="save-update">
    <key column="user_id"></key>
    <many-to-many class="Role" column="role_id"></many-to-many>
</set>

(2)操作

操作關聯屬性
//用戶表達關係
u1.getRoles().add(r1);
u1.getRoles().add(r2);

u2.getRoles().add(r1);
u2.getRoles().add(r2);
//角色表達關係
r1.getUsers().add(u1);
r1.getUsers().add(u2);

r2.getUsers().add(u1);
r2.getUsers().add(u2);
//調用save方法依次保存
session.save(u1);
session.save(u2);
session.save(r1);
session.save(r2);

(3)進階操作

1.級聯操作
<!-- cascade:級聯操作
    save-update:級聯保存更新
    delete:級聯刪除
    all:級聯保存更新+級聯刪除
 結論:cascade簡化代碼書寫,該屬性使用不使用都可以,建議要用只用save-update
 如果使用delete操作太過危險,尤其在多對多中不建議使用 -->
<set name="roles" table="sys_user_role" cascade="save-update">
<key column="user_id"></key>
<many-to-many class="Role" column="role_id"></many-to-many>
</set>
2.關係維護
<!-- 添加inverse屬性 
     true:放棄維護外鍵關係
     false:(默認值)
     結論:在將來的開發中,如果遇到多對多關係,一定要選擇一方放棄維護關係
         一般誰來放棄需要看業務方向,例如錄入員工時,需要爲員工指定所屬角色,
      name業務方向就是由員工來維護角色,角色不需要維護與員工關係,角色放棄維護-->
<set name="users" table="sys_user_role" inverse="true" >
    <key column="role_id"></key>
    <many-to-many class="User" column="user_id"></many-to-many>
</set>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章