【Hibernate框架】對象的三種持久化狀態

1、綜述

          hibernate中的對象有三種狀態,分別是TransientObjects(瞬時對象)、PersistentObjects(持久化對象)和DetachedObjects(託管對象也叫作離線對象)。java

 

2、Hibernate對象三種狀態轉化圖:

 

3、Hibernate對象三種狀態簡介及轉化條件:

(1)臨時狀態:mysql

       由Java的new命令開闢內存空間的java對象也就是普通的java對象,若是沒有變量引用它它將會被JVM收回。簡單的說就是程序裏面new一個對象,尚未和session關聯web

(1.1)臨時狀態——>持久化狀態:sql

       臨時對象在內存中是孤立存在的,它的意義是攜帶信息載體,不和數據庫中的數據由任何的關聯。經過Session的save()方法和saveOrUpdate()方法能夠把一個臨時對象和數據庫相關聯,並把臨時對象攜帶的信息經過配置文件所作的映射插入數據庫中,這個臨時對象就成爲持久化對象。數據庫

 

(2)持久化狀態:緩存

       對象和session有了關聯,對象處於hibernate框架管理中.持久化對象在數據庫中都有相應的記錄,持久化對象能夠是剛剛被保存的,也能夠是調用get或者load方法剛剛加載的,但都是在相關聯的session生命週期中保存這個狀態。若是是直接從數據庫中查詢所返回的數據對象,那這些對象和數據庫中的字段相關聯,具備相同的id,他們立刻變成持久化對象。若是一個臨時對象被持久化對象引用,也立刻會變爲持久化對象。session

(2.1)持久化狀態——>臨時狀態app

       使用delete()方法,持久化對象變爲臨時對象,而且刪除數據庫中相應的記錄,這個對象再也不與數據庫有任何的聯繫。框架

(2.2)持久化狀態——>離線對象jvm

      當一個session()執行close()、clear()、或evict()以後,持久化對象就變爲離線對象,這時對象的id雖然擁有數據庫的識別值,但已經不在Hibernate持久層的管理下,他和臨時對象基本上同樣的,只不過比臨時對象多了數據庫標識id。沒有任何變量引用時,jvm將對其進行回收。

 

       持久化對象老是與Session和事務(Transaction)關聯在一塊兒,在一個session中,對持久化對象的操做不會當即寫到數據庫,只有當Transaction(事務)結束時也就是提交事務執行commit方法的時候,才真正的對數據庫更新,從而完成持久化對象和數據庫的同步。在同步以前的持久化對象成爲髒對象。

 

(3)託管對象(離線狀態):

       在持久態的狀況下,對象和session失去了關聯,好比session.close()或session.evite(obj) 後,即遊離態,但數據已經存儲到了數據庫。Session關閉以後,與此Session關聯的持久化對象就變成爲脫管對象,能夠繼續對這個對象進行修改,若是脫管對象被從新關聯到某個新的Session上,會在此轉成持久對象。脫管對象雖然擁有用戶的標識id,因此經過update()、saveOrUpdate()等方法,再次與持久層關聯。

(3.2)離線狀態——>臨時狀態

      執行Delete方法。

 

 

4、代碼演示:

[java]  view plain copy
 print?在CODE上查看代碼片派生到個人代碼片
  1. public class SessionTest extends TestCase {  
  2.     public void testSave1()  
  3.     {  
  4.         Session session = null;  
  5.         Transaction tx = null;  
  6.         try  
  7.         {              
  8.             session = HibernateUtils.getSession();//取得session.  
  9.             tx = session.beginTransaction();//開啓事務. 返回 transient的一個實例.  
  10.                
  11.             User user = new User();//這裏經過new一個User類型的對象,產生一個Transient(臨時)狀態的對象.  
  12.             user.setName("張三");  
  13.             user.setPassword("123");  
  14.             user.setCreateTime(new Date());  
  15.             //緩存的時候(髒數據檢查)的時候,會和數據庫同步.  
  16.             session.save(user);//進行保存.執行save則對session進行管理,對象變爲持久化狀態.發出insert語句,自動生成user表的標識id值  
  17.             user.setName("李四");//持久化(persistent)狀態的對象.會發出update語句,當對象的屬性發生改變的時候,hibernate在清理          
  18.             tx.commit();//進行提交,關閉事務.  
  19.         }catch(Exception e)  
  20.         {  
  21.             e.printStackTrace();  
  22.             if(tx!=null)  
  23.             {  
  24.                 // 事務回滾.  
  25.                 tx.rollback();  
  26.             }  
  27.         }finally  
  28.         {  
  29.             HibernateUtils.closeSession(session);//關閉session.當關閉session後處於Detached(離線)狀態.  
  30.         }  //這時候,就不能再用之前的session了再想將此對象變爲持久化對象須要從新獲得新的session,開啓事務,將此對象歸入session管理         
  31.     }  

    日誌記錄:

 

     

[sql]  view plain copy
 print?在CODE上查看代碼片派生到個人代碼片
  1. Hibernate: insert into User (name,password,createTime) values (?,?,?,?)  
  2. Hibernate: update User set name=?,password=?,createTime=? where id=?  
相關文章
相關標籤/搜索