1. 程式人生 > >hibernate中一對多表關係操作(7)

hibernate中一對多表關係操作(7)

1、基本操作,儲存客戶、聯絡人,並設定它們的關聯

public void test01(){
		Session session = HibernateUtils.OpenSession();
		Transaction tx = session.beginTransaction();
		
		Customer customer = new Customer();
		customer.setCust_name("傳播智客");
		
		LinkMan lm1 = new LinkMan();
		lm1.setLkm_name("黎活明");
		
		LinkMan lm2 = new LinkMan();
		lm2.setLkm_name("劉悅東");
		
		//表達一對多,一個客戶下有多個聯絡人
		customer.getLinkMens().add(lm1);
		customer.getLinkMens().add(lm2);
		
		//表達多對一,聯絡人屬於哪個客戶
		lm1.setCustomer(customer);
		lm2.setCustomer(customer);
		
		//瞬時態-->持久態
		session.save(customer);
		session.save(lm1);
		session.save(lm2);
		
			
		tx.commit();
		session.close();
	}

2、為客戶新增聯絡人

@Test
	public void test02(){
		Session session = HibernateUtils.OpenSession();
		Transaction tx = session.beginTransaction();
		
		//獲得要操作的客戶
		Customer customer = session.get(Customer.class, 1l);
		
		//建立聯絡人物件
		LinkMan lm = new LinkMan();
		lm.setLkm_name("郝強勇");
		
		//將聯絡人新增到客戶物件中
		customer.getLinkMens().add(lm);
		//設定聯絡人的客戶
		lm.setCustomer(customer);
		
		//執行儲存
		session.save(lm);
		
		
			
		tx.commit();
		session.close();
	}

3、為客戶刪除聯絡人

public void test03(){
		Session session = HibernateUtils.OpenSession();
		Transaction tx = session.beginTransaction();
		
		//獲得要操作的客戶
		Customer customer = session.get(Customer.class, 1l);
		
		//獲得要刪除的聯絡人
		LinkMan lm = session.get(LinkMan.class, 3l);
		
		
		//將聯絡人從客戶物件中移除
		customer.getLinkMens().remove(lm);
		//設定聯絡人的客戶為空
		lm.setCustomer(null);
			
		tx.commit();
		session.close();
	}

一對多表操作進階---級聯操作:

一的一方的對映檔案配置:

<!-- 
級聯操作:cascade
save-update:級聯儲存
delete:級聯刪除
all:save-update+delete
 -->
<set name="linkMens" cascade="save-update">
    <key column="lkm_cust_id"></key>
    <one-to-many class="LinkMan"/>
</set>


public void test01(){
		Session session = HibernateUtils.OpenSession();
		Transaction tx = session.beginTransaction();
		
		Customer customer = new Customer();
		customer.setCust_name("傳播智客");
		
		LinkMan lm1 = new LinkMan();
		lm1.setLkm_name("黎活明");
		
		LinkMan lm2 = new LinkMan();
		lm2.setLkm_name("劉悅東");
		
		//表達一對多,一個客戶下有多個聯絡人
		customer.getLinkMens().add(lm1);
		customer.getLinkMens().add(lm2);
		
		//表達多對一,聯絡人屬於哪個客戶
		lm1.setCustomer(customer);
		lm2.setCustomer(customer);
		
		//瞬時態-->持久態,級聯儲存
		session.save(customer);
		//session.save(lm1);
		//session.save(lm2);
		
			
		tx.commit();
		session.close();
	}

2、級聯刪除

public void test04(){
		Session session = HibernateUtils.OpenSession();
		Transaction tx = session.beginTransaction();
		
		//級聯刪除
		Customer customer = session.get(Customer.class, 1l);
		session.delete(customer);
			
		tx.commit();
		session.close();
	}

目的:簡化操作,一般使用save-update,不建議使用delete。

3、關係維護

在儲存時,兩方都會維護外來鍵關係,關係維護了兩次,冗餘了。多餘的關係維護語句,顯然是客戶端在維護外來鍵關係。