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>