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


一、綜述

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

 

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

 

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

(1)臨時狀態:

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

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

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

 

(2)持久化狀態:

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

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

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

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

      當一個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方法。

 

 

四、代碼演示:

[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=?  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM