1. 程式人生 > >Hibernate_day03---表與表關係建立、一對多配置及操作、多對多配置及操作

Hibernate_day03---表與表關係建立、一對多配置及操作、多對多配置及操作

一、表與表關係建立思路


一對多關係

關係舉例:
(1)分類和商品關係。
		一個分類裡面有多個商品,一個商品只能屬於一個分類
(2)公司和員工關係
		一個公司有多個員工,每個員工屬於一個公司

一對多建表:通過外來鍵建立關係

圖示:
在這裡插入圖片描述

多對多關係

關係舉例:
(1) 人與角色關係
		一個人有多個角色(學生,兒子,青年),一個角色可以有多個人(張三、李四、王五)

多對多建表:建立第三張表維護關係

圖示
在這裡插入圖片描述

二、一對多環境配置


客戶和聯絡人:客戶是一,聯絡人是多。

第一步 建立兩個實體類,客戶和聯絡人。
//客戶
	public class Customer {
		private Integer cid;  //客戶id
		private String custName; //客戶名稱
		private String custLevel;  //客戶級別
		private String custSource;  //客戶來源
		private String custPhone;  //聯絡電話
		private String custMobile;  //手機
	}
	
//聯絡人
	public class LinkMan {
		private Integer lkm_id; // 聯絡人編號(主鍵)
		private String lkm_name;// 聯絡人姓名
		private String lkm_gender;// 聯絡人性別
		private String lkm_phone;// 聯絡人辦公電話
	}
第二步 讓兩個實體類之間互相表示
//Hibernate要求用Set集合存放多的一方,泛型為多的類。
	
	//多對一中的一 (客戶)
	private Set<LinkMan> setLinkMan = new HashSet<LinkMan>();
	public Set<LinkMan> getSetLinkMan() {
		return setLinkMan;
	}
	public void setSetLinkMan(Set<LinkMan> setLinkMan) {
		this.setLinkMan = setLinkMan;
	}

//在多中,建立一的類。用來表示所屬關係  (一個聯絡人只能有一個客戶)
	
	//多對一中的多(聯絡人)
	private Customer customer;
	public Customer getCustomer() {
		return customer;
	}
	public void setCustomer(Customer customer) {
		this.customer = customer;
	}
第三步 配置對映關係
1)完成基本配置(每個實體類分別對應一個對映檔案)
2)配置一對多對映關係(使用set標籤)	

在客戶對映檔案中,表示所有聯絡人
在這裡插入圖片描述
在聯絡人對映檔案中,表示所屬客戶
在這裡插入圖片描述

第四步 建立核心配置檔案,把對映檔案引入到核心配置檔案中

在這裡插入圖片描述
建表,測試配置
在這裡插入圖片描述

三、一對多級聯操作


級聯儲存
(1)複雜寫法:

	/**
	 * HibernateOneToMany
	 * 新增客戶新增聯絡人測試
	 * 
	 * @author 一萬年行不行
	 */
	public class HibernateOneToMany {
		
		SessionFactory sessionFactory = null;
		Session session = null;
		Transaction transaction = null;
		@Test
		public void oneToMany(){
			try{
				//1.得到sessionFactory建立表.
				sessionFactory = HibernateUtils.getSessionFactory();
				
				//2.得到session
				session = sessionFactory.openSession();
				
				//3.呼叫session開啟事務
				transaction = session.beginTransaction();	
				/*
				 * 4.業務邏輯---新增客戶
				 * 
				 * 1.建立客戶、
				 * 2.建立聯絡人、
				 * 3.將聯絡人設定到客戶、
				 * 4.為聯絡人設定客戶
				 * 5.儲存到資料庫
				 */
				//建立客戶
				Customer customer = new Customer();
				customer.setCustName("百度");
				customer.setCustLevel("vip");
				customer.setCustSource("網路");
				customer.setCustPhone("123456");
				customer.setCustMobile("5555");
				
				//建立聯絡人
				LinkMan linkman = new LinkMan();
				linkman.setLkm_name("lucy");
				linkman.setLkm_gender("男");
				linkman.setLkm_phone("911");
				
				//將聯絡人設定到客戶、
				customer.getSetLinkMan().add(linkman);
				
				//為聯絡人設定客戶
				linkman.setCustomer(customer);
				
				//儲存到資料庫
				session.save(customer);
				session.save(linkman);
				
				//5.提交事務
				transaction.commit();
			}catch(Exception e){
				//5.事務回滾
				transaction.rollback();
			}finally{
				//6.關閉資源
				session.close();
				//sessionFactory.close();
			}
		}
	}

測試
在這裡插入圖片描述在這裡插入圖片描述

(2)簡化寫法
	簡化內容:只需要在客戶新增聯絡人即可,不再需要雙向儲存

在這裡插入圖片描述在這裡插入圖片描述

級聯刪除

第一步 在客戶對映檔案set標籤,進行配置
	使用屬性cascade屬性值 delete

在這裡插入圖片描述

第二步 在程式碼中直接刪除客戶
	根據id查詢物件,呼叫session裡面delete方法刪除

在這裡插入圖片描述

修改操作(inverse屬性)

(1)因為hibernate雙向維護外來鍵。
	導致系統需要修改兩次外來鍵(客戶和聯絡人都需要維護外來鍵),造成效率問題

在這裡插入圖片描述

(2)解決方式:讓其中的一方不維護外來鍵(多對一中的一)

在這裡插入圖片描述

四、多對多對映配置


以使用者和角色為例演示

第一步 建立實體類,使用者和角色

第二步 讓兩個實體類之間互相表示
(1)一個使用者裡面表示所有角色,使用set集合

在這裡插入圖片描述

(2)一個角色有多個使用者,使用set集合

在這裡插入圖片描述

第三步 配置對映關係
(1)基本配置
(2)配置多對多關係

在這裡插入圖片描述

第四步 在核心配置檔案中引入對映檔案

在這裡插入圖片描述
建表 測試配置:
在這裡插入圖片描述

五、多對多操作


級聯儲存

第一步 在使用者配置檔案中set標籤進行配置,cascade值save-update
在這裡插入圖片描述

第二步 程式碼實現

(1)建立使用者和角色物件,把角色放到使用者裡面,儲存使用者
	//演示多對多修級聯儲存
	@Test
	public void testSave() {
		SessionFactory sessionFactory = null;
		Session session = null;
		Transaction tx = null;
		try {
			//得到sessionFactory
			sessionFactory = HibernateUtils.getSessionFactory();
			//得到session
			session = sessionFactory.openSession();
			//開啟事務
			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("456");
			
			Role r1 = new Role();
			r1.setRole_name("總經理");
			r1.setRole_memo("總經理");
			
			Role r2 = new Role();
			r2.setRole_name("祕書");
			r2.setRole_memo("祕書");
			
			Role r3 = new Role();
			r3.setRole_name("保安");
			r3.setRole_memo("保安");
			
			//2 建立關係,把角色放到使用者裡面
			// user1 -- r1/r2
			user1.getSetRole().add(r1);
			user1.getSetRole().add(r2);
			
			// user2 -- r2/r3
			user2.getSetRole().add(r2);
			user2.getSetRole().add(r3);
			
			//3 儲存使用者
			session.save(user1);
			session.save(user2);
			
			//提交事務
			tx.commit();

		}catch(Exception e) {
			tx.rollback();
		}finally {
			session.close();
			//sessionFactory不需要關閉
			sessionFactory.close();
		}
	}

在這裡插入圖片描述

級聯刪除
第一步 在set標籤進行配置,cascade值delete
第二步 刪除使用者

在這裡插入圖片描述在這裡插入圖片描述

#六、維護第三張表關係

使用者和角色多對多關係,維護關係通過第三張表維護

1)產生關係
	第一步 根據id查詢使用者和角色
	第二步 把角色放到使用者裡面

在這裡插入圖片描述

2)刪除關係
	第一步 根據id查詢 使用者和角色
	第二步 去掉使用者中的角色

在這裡插入圖片描述