hibernate持久化物件值改變後自動更新的條件
阿新 • • 發佈:2019-01-29
在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之間。