理解Hibernate的三種狀態,更利於理解Hibernate的執行機制,這些可以讓你在開發中對疑點問題的定位產生關鍵性的幫助。
三種狀態
臨時狀態(Transient):在透過new關鍵字,例項化一個物件開始,該物件就進入了臨時狀態,但它還沒有被持久化,沒有儲存在Session當中。
持久化狀態(Persistent):物件被加入到Session快取當中,如透過session.save(entity),Hibernate把實體儲存到seesion當中,entity就處在持久化狀態中。
遊離狀態(Detached):物件脫離了session快取,如透過session清理,將物件儲存到資料庫中,原來在session中的物件仍然與記憶體中,該物件就處於遊離狀態。
臨時狀態 (Transient) | 持久化狀態 (Persistent) | 遊離狀態 (Detached) | |
是否存於Session快取中 | × | √ | × |
資料庫中是否有對應記錄 | × | √ | √ |
物件生命週期
下面以一個物件從生成到儲存到資料庫的流程做一下解析:
當一個物件被例項化出來以後,該物件是臨時狀態,當呼叫方法session.save(entity),後該物件被加入到session快取中,進入持久化狀態,這時資料庫中還不存在相關的記錄,當session提交資料庫事務時,這裡隱含做了兩件事,一件事是隱式呼叫session.flush(),其作用先是清理快取(相當於呼叫了session.clear()),再生成一條對應的insert語句,但該語句還沒有提交,第二件事是對剛才生成的語句進行提交,從而在資料庫中生成了對應的記錄。至此原entity物件就在資料庫中生成了一條對應的記錄,而它本身也脫離了session快取,處於遊離狀態,該物件經過垃圾回收機制處理被回收。一個hibernate的儲存物件過程就此結束。
例項程式碼如下:
1: Session session = null;
2: try {
3: session = HibernateUtil.openSession();
4: //開始事務
5: session.beginTransaction();
6: //member物件進入臨時狀態
7: Member member = new Member();
8: member.setMobile("18208195215");
9: member.setUsername("liping");
10: //member物件進入持久化狀態
11: session.save(member);
12: //提交事務,隱式包含了session.flush()的動作
13: session.getTransaction().commit();
14: //提交完成後,member處於遊離狀態
15: } catch (HibernateException e) {
16: e.printStackTrace();
17: if (session != null)
18: session.getTransaction().rollback();
19: } finally {
20: if (session != null)
21: session.close();
22: }