初學Hibernate,了解到Hibernate有三種狀態:transient(瞬時狀態),persistent(持久化狀態)以及detached(游離狀態)。
它們之間有如下轉換圖來說明:
1、transient(瞬時狀態)。
如上圖所示,當new出來一個新對象,還沒有保存到數據庫中的時候,就是transient狀態。
代碼表示如下:
1 session=HibernateUtils.getSession(); 2 tx=session.beginTransaction(); 3 //Transient狀態 4 User user=new User(); 5 user.setName("Jessica"); 6 user.setPassword("123"); 7 user.setCreateTime(new Date()); 8 user.setExpireTime(new Date()); 9 //********************************************************************** 10 /* 11 * 以上user就是一個Transient(瞬時狀態),此時user並沒有被session進行托管,即在session的 12 * 緩存中還不存在user這個對象,當執行完save方法后,此時user被session托管,並且數據庫中存在了該對象 13 * user就變成了一個Persistent(持久化對象) 14 */ 15 //***********************************************************************
2、persistent(持久化狀態)。
當臨時狀態的對象被執行save之后,就會被session托管,在session中有一個map存放着user對象,也就是說user對象被session引用着,被session納入管理了。此時的user就處於持久狀態了。
1 session=HibernateUtils.getSession(); 2 tx=session.beginTransaction(); 3 //Transient狀態 4 User user=new User(); 5 user.setName("Jessica"); 6 user.setPassword("123"); 7 user.setCreateTime(new Date()); 8 user.setExpireTime(new Date()); 9 //********************************************************************** 10 /* 11 * 以上user就是一個Transient(瞬時狀態),此時user並沒有被session進行托管,即在session的 12 * 緩存中還不存在user這個對象,當執行完save方法后,此時user被session托管,並且數據庫中存在了該對象 13 * user就變成了一個Persistent(持久化對象) 14 */ 15 //*********************************************************************** 16 //Persistent狀態 17 session.save(user);
3、detached(游離狀態)。
當持久狀態的對象user,在session關閉之后就會變成有游離狀態。
1 Session session=null; 2 Transaction tx=null; 3 4 try { 5 session=HibernateUtils.getSession(); 6 tx=session.beginTransaction(); 7 //Transient狀態 8 User user=new User(); 9 user.setName("Jessica"); 10 user.setPassword("123"); 11 user.setCreateTime(new Date()); 12 user.setExpireTime(new Date()); 13 //********************************************************************** 14 /* 15 * 以上user就是一個Transient(瞬時狀態),此時user並沒有被session進行托管,即在session的 16 * 緩存中還不存在user這個對象,當執行完save方法后,此時user被session托管,並且數據庫中存在了該對象 17 * user就變成了一個Persistent(持久化對象) 18 */ 19 //*********************************************************************** 20 //Persistent狀態 21 session.save(user); 22 23 //進行修改操作,修改name=“Juyahong” 24 user.setName("Juyahong"); 25 //提交事務 26 tx.commit(); 27 28 } catch (Exception e) { 29 e.printStackTrace(); 30 if (tx != null) { 31 tx.rollback(); 32 } 33 } finally{ 34 35 HibernateUtils.closeSession(session); 36 } 37 38 //detached狀態
通過以上例子,可以基本理解了Hibernate的三種狀態,其實可以舉個例子來說明:我們把數據庫比喻成一個登記簿,當我們把信息登記到登記簿上的時候,這個過程就是持久化的過程。當登記完成之后,登記簿上的數據就是持久態數據,所謂持久態就是一直存在的狀態。當我們需要用數據的時候,會從登記簿上查信息,我們查到的信息記錄在臨時的紙張或者腦海里,然后登記簿會放回原位,這時候臨時紙張上或者腦海里的數據就是游離態,隨時可能被遺忘,在hibernate中就是隨時會被銷毀的數據。瞬態數據和游離態數據有點兒類似,但是一點,就是他是存在持久化之前的數據,就是說我需要登記個人信息,我的個人信息還沒有登記到登記簿上的時候,信息就是瞬態,一旦登記到登記簿上就變成持久態了,然后再查詢到的就是游離態。