Hibernate的三種狀態及物件生命週期

飄揚的紅領巾發表於2013-08-29

    理解Hibernate的三種狀態,更利於理解Hibernate的執行機制,這些可以讓你在開發中對疑點問題的定位產生關鍵性的幫助。

三種狀態

臨時狀態(Transient):在透過new關鍵字,例項化一個物件開始,該物件就進入了臨時狀態,但它還沒有被持久化,沒有儲存在Session當中。

持久化狀態(Persistent):物件被加入到Session快取當中,如透過session.save(entity),Hibernate把實體儲存到seesion當中,entity就處在持久化狀態中。

遊離狀態(Detached):物件脫離了session快取,如透過session清理,將物件儲存到資料庫中,原來在session中的物件仍然與記憶體中,該物件就處於遊離狀態。

臨時狀態

(Transient)

持久化狀態

(Persistent)

遊離狀態

(Detached)

是否存於Session快取中 × ×
資料庫中是否有對應記錄 ×

 

物件生命週期

image

 

下面以一個物件從生成到儲存到資料庫的流程做一下解析:

    當一個物件被例項化出來以後,該物件是臨時狀態,當呼叫方法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:          }

相關文章