1. 程式人生 > >Hibernate5(2016)——級聯操作

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集合裡面把角色移除