Hibernate5(2016)——級聯操作
1.表於表之間關係回顧:
1 一對多
分類和商品關係,一個分類裡面有多個商品,一個商品只能屬於一個分類
客戶和聯絡人是一對多的關係
-客戶:與公司有業務往來,百度、新浪、360
-聯絡人:公司裡面的員工,百度裡面有很多的員工,聯絡員工
** 公司和公司員工的關係
-客戶是一,聯絡人是多
-一個客戶裡面有很多個聯絡人,一個聯絡人只能屬於一個客戶
一對多建表:通過外來鍵建立關係
2 多對多
訂單和商品關係,一個訂單裡面有多個商品,一個商品屬於多個訂單
使用者和角色多對多關係
-使用者:小王、小馬、小宋
-角色:總經理、祕書、司機、保安
**比如小王 可以是總經理,可以是司機
**比如小宋 可以是司機,可以是祕書,可以是保安
**比如小馬 可以是祕書,可以是總經理
-一個使用者裡面可以有多個角色,一個角色裡面可以有多個使用者
多對多建表:建立第三張表維護關係
3 一對一
在中國,一個男人只能有一個妻子,一個女人只能有一個丈夫
2.Hibernate的一對多操作(重點):
2.1 一對多對映配置:
以客戶和聯絡人為例:客戶是一,聯絡人是多
第一步 建立兩個實體類,客戶和聯絡人
第二步 讓兩個實體類之間互相表示
在客戶實體類裡面表示多個聯絡人
-一個客戶裡面有多個聯絡人
在聯絡人實體類裡面表示所屬客戶
-一個聯絡人只能屬於一個客戶
第三步 配置對映關係
一般一個實體類對應一個對映檔案
把對映最基本配置完成
在對映檔案中,配置一對多關係
-在客戶對映檔案中,表示所有聯絡人
-在聯絡人對映檔案中,表示所屬客戶
第四步 建立核心配置檔案,把對映檔案引入到核心配置檔案中
測試:
2.2 一對多級聯操作:
級聯操作
1 級聯儲存
新增一個客戶,為這個客戶新增多個聯絡人
2 級聯刪除
刪除某一個客戶,這個客戶裡面的所有的聯絡人也要刪除
2.3 一對多級聯儲存:
1 新增客戶,為這個客戶新增一個聯絡人
複雜寫法
//演示一對多級聯儲存
public void testAddDemo1(){
Session session=null;
Transaction tx=null;
try{
session=HibernateUtils.getSessionobject();
//開啟事務
tx=session.beginTransaction();
//新增一個客戶,為這個客戶新增一個聯絡人
//1 建立客戶和聯絡人物件
Customer customer=new Customer();
customer.setCustName("傳智播客");
customer.setCustLevel("vip");
customer.setCustSource("網路");
customer.setCustPhone("110");
customer.setCustMobile("999");
LinkMan linkman=new LinkMan();
linkman.setLkm_gender("男");
linkman.setLkm_name("lucy");
linkman.setLkm_phone("911");
//2 在客戶表示聯絡人,在聯絡人表示客戶
//建立客戶物件和聯絡人物件關係
//2.1 把聯絡人放到客戶實體類物件的set集合裡面
customer.getSetLinkMan().add(linkman);
//2.2 把客戶物件放到聯絡人裡面
linkman.setCustomer(customer);
//3 儲存到資料庫
session.save(customer);
session.save(linkman);
//提交事務
tx.commit();
}catch(Exception e){
e.printStackTrace();
//回滾事務
tx.rollback();
}finally{
//關閉操作
session.close();
//sessionFactory.close();
}
}
簡化寫法
-一般根據客戶新增聯絡人
第一步 在客戶對映檔案中進行配置
-在客戶對映檔案裡面set標籤進行配置
第二步 建立客戶和聯絡人物件,只需要把聯絡人放到客戶裡面就可以了
public void testAddDemo2(){
Session session=null;
Transaction tx=null;
try{
session=HibernateUtils.getSessionobject();
//開啟事務
tx=session.beginTransaction();
//新增一個客戶,為這個客戶新增一個聯絡人
//1 建立客戶和聯絡人物件
Customer customer=new Customer();
customer.setCustName("百度");
customer.setCustLevel("普通客戶");
customer.setCustSource("網路");
customer.setCustPhone("110");
customer.setCustMobile("999");
LinkMan linkman=new LinkMan();
linkman.setLkm_gender("男");
linkman.setLkm_name("小紅");
linkman.setLkm_phone("911");
//2 把聯絡人放到客戶裡面
customer.getSetLinkMan().add(linkman);
//3 儲存到資料庫
session.save(customer);
//提交事務
tx.commit();
}catch(Exception e){
e.printStackTrace();
//回滾事務
tx.rollback();
}finally{
//關閉操作
session.close();
//sessionFactory.close();
}
}
2.4 一對多級聯刪除:
1 刪除某個客戶,把客戶裡面所有的聯絡人刪除
2 具體實現
第一步 在客戶對映檔案set標籤,進行配置
使用屬性cascade屬性值delete
第二步 在程式碼中直接刪除客戶
根據id查詢物件,呼叫session裡面delete方法刪除
3 執行過程
根據id查詢客戶
根據外來鍵id值查聯絡人
把聯絡人外來鍵設定為null
刪除聯絡人和客戶
2.5 一對多修改操作 (inverse屬性):
1 讓lucy聯絡人所屬客戶不是傳智播客而是百度
2 inverse屬性
因為hibernate是雙向維護外來鍵,在客戶和聯絡人裡面都需要維護外來鍵,修改客戶時候,修改一次外來鍵,修改聯絡人時候也修改一次外來鍵,造成效率問題
解決方式:讓其中的一方不維護外來鍵
-一對多裡面,讓其中一的一方放棄外來鍵維護
-一個國家有總統,國家有很多人,總統不能認識國家所有人,國家所有人可以認識總統
具體實現
在放棄關係維護對映檔案中,進行配置,在set標籤上使用inverse屬性
3.Hibernate多對多操作:
3.1 多對多對映配置:
以使用者和角色為例演示
第一步 建立實體類,使用者和角色
第二步 讓兩個實體類之間互相表示
一個使用者裡面表示所有角色,使用set集合
一個角色有多個使用者,使用set集合
第三步 配置對映關係
基本配置
配置多對多關係
-在使用者裡面表示所有角色,使用set標籤
-在角色裡面表示所有使用者,使用set標籤
第四步 在核心配置檔案中引入對映檔案
測試:
3.2 多對多級聯儲存:
根據使用者儲存角色
第一步 在使用者配置檔案中set標籤進行配置,cascade值save-update
第二步 寫程式碼實現
建立使用者和角色物件,把角色放到使用者裡面,最終儲存使用者就可以了
//演示多對多級聯儲存
public void testSave(){
Session session=null;
Transaction tx=null;
try{
session=HibernateUtils.getSessionobject();
//開啟事務
tx=session.beginTransaction();
//新增兩個使用者,為每個使用者新增兩個角色
//1 建立角色
User user1=new User();
user1.setUser_name("lucy");
user1.setUser_password("123");
User user2=new User();
user2.setUser_name("mary");
user2.setUser_password("234");
Role role1=new Role();
role1.setRole_name("總經理");
role1.setRole_memo("總經理");
Role role2=new Role();
role2.setRole_name("祕書");
role2.setRole_memo("祕書");
Role role3=new Role();
role3.setRole_name("保安");
role3.setRole_memo("保安");
//2 建立關係 把角色放到使用者裡面
//user1--r1/r2
user1.getSetRole().add(role1);
user1.getSetRole().add(role2);
//user2--r2/r3
user2.getSetRole().add(role2);
user2.getSetRole().add(role3);
//3 儲存使用者
session.save(user1);
session.save(user2);
//提交事務
tx.commit();
}catch(Exception e){
e.printStackTrace();
//回滾事務
tx.rollback();
}finally{
//關閉操作
session.close();
//sessionFactory.close();
}
}
3.3 多對多級聯刪除:
第一步 在set標籤進行配置,cascade值delete
第二步 刪除使用者
3.4 維護第三張表關係:
1 使用者和角色多對多關係,維護關係通過第三張表維護
2 讓某個使用者有某個角色
第一步 根據id查詢使用者和角色
第二步 把角色放到使用者裡面
把角色物件放到使用者set集合
3 讓某個使用者沒有某個角色
第一步 根據id查詢使用者和角色
第二步 從使用者裡面把角色去掉
從set集合裡面把角色移除