1. 程式人生 > >Hibernate的學習之路二十二(一對多的級聯刪除)

Hibernate的學習之路二十二(一對多的級聯刪除)

前言

   這篇主要說明了級聯刪除,比較繁瑣需要舉例子說明

程式碼

技術分析之級聯刪除

1. 先來給大家在資料庫中演示含有外來鍵的刪除客戶功能,那麼SQL語句是會報出錯誤的
    * 例如:delete from customers where cid = 1;

2. 如果使用Hibernate框架直接刪除客戶的時候,測試發現是可以刪除的(這裡需要配置級聯刪除,如果不配置也是報錯的)

3. 上述的刪除是普通的刪除,那麼也可以使用級聯刪除,注意:級聯刪除也是有方向性的!!
    * <many-to-one cascade="delete" />

現在舉個例子

A 是一      B C是多。

以下是沒有配置delete欄位。刪除的結果是A刪除了,B和C裡的外來鍵都修改成null。

	/**
	 * 測試:刪除客戶,客戶下有2個聯絡人
	 */
	@Test
	public void run6(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tr = session.beginTransaction();
		// 先查詢1號客戶
		Customer c1 = session.get(Customer.class, 1L);
		session.delete(c1);
		
		tr.commit();
	}

以下是設定了A(一)的delete。結果是A刪除了,B和C刪除了

	/**
	 * 測試級聯刪除,刪除客戶,級聯刪除客戶下的聯絡人
	 */
	@Test
	public void run7(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tr = session.beginTransaction();
		// 先查詢1號客戶
		Customer c1 = session.get(Customer.class, 1L);
		session.delete(c1);
		tr.commit();
	}


以下是設定了B(多)的delete。結果是A刪除了,B刪除了, A的外來鍵修改成null。

	@Test
	public void run8(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tr = session.beginTransaction();
		
		Linkman man = session.get(Linkman.class, 1L);
		session.delete(man);
		
		tr.commit();
	}

以下是一和多都設定了delete,結果是A和B和C都刪除了。

	/**
	 * 測試級聯刪除
	 */
	@Test
	public void run9(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tr = session.beginTransaction();
		Linkman man = session.get(Linkman.class, 1L);
		session.delete(man);
		tr.commit();
	}

其他

在企業中,對刪除是非常重視的,不要隨意刪除,有些只是在資料庫中多添加了一個欄位,來判斷使用者那邊是否刪除了這個資料。

留著資料可以進行分析,或者有功能是回收站功能,可以還原的功能。