1. 程式人生 > >hibernate持久化物件值改變後自動更新的條件

hibernate持久化物件值改變後自動更新的條件

在hibernate中,持久化物件分為三種狀態:
1)瞬時態 transient  (臨時物件) :無持久化標識OID,未與Session關聯 ,
2)持久態 persistent  :存在持久化標識OID,與Session關聯
3)脫管態 detached (離線物件):存在持久化標識OID,未與Session關聯 (session.close)

物件的狀態可以相互之間進行轉換
直接獲得瞬時態物件:new Customer()
瞬時 --》持久 session.save(customer);
瞬時 --》託管 customer.setId(1);

直接獲得持久態物件:session.get();
持久 --》瞬時 session.delete();
持久 --》託管 sesion.evict,session.close,session.clear,清除物件在一級快取中的引用

直接獲得託管物件:不能直接獲得
託管 --》瞬時 刪除OID
託管 --》持久 update ,saveOrUpdate

而只要session存在,它的快取的生命週期就一直存在。Session flush的三種情況為事務提交、呼叫查詢方法(query)以及手動呼叫flush,session.close()。

持久化物件在一級快取中的值改變後,與所對應的快照區的資料不同,每當觸發Session flush後,會主動更新資料庫,例如:

	@Test
	public void test123() {
		Session session =sessionFactory.getCurrentSession();
		Transaction tx = session.beginTransaction();
		//c持久態------存在於session的快取中
		Customer c1 = (Customer) session.get(Customer.class, 1);
		
		//改變持久態物件
		c1.setName("rose");
		
		Query query = session.createQuery("from Customer");
		//list查詢時會flush
		query.list();
		
		//事務提交時會flush
		tx.commit();
		session.close();

		// 因為session已經關閉,託管態物件
		System.out.println(c1.getId());
	}

在上述方法中,當程式執行到query.list()時,會自動更物件c1,,而在事務提交以及session關閉時,持久化物件c1的值與快照區的值相同,故不會執行update。此方法中的update執行在兩個select之間。