Hibernate持久化生命週期——三態

來源:互聯網
上載者:User

標籤:hibernate   java   

    通過前幾篇部落格的大概介紹,我們發現hibernate將業務實體持久化到資料庫的工作原理的實現,是通過“映射xml”來銜接的。那麼這個xml的由來是哪?
      對應檔(hbm)合理的存在的前提就是“有與之對應的實體的存在”——業務實體。
    
      今天這篇部落格就來說說實體到資料庫的過程,這是一個從代碼到資料的持久化過程,就是hibernate實現ORM持久化的生命週期。
    
 一、持久化對象生命週期

     是hibernate持久化的一個狀態圖,可以看出,ORM這個過程經曆了三個狀態:transient,Persistent,Detached。

    

     首先來理解一下 實體物件的三種狀態:Transient object ,persist object,detached object包含的資訊:   
     1、Transient Object(臨時對象):很明顯圖中,在起點位置:我們New 了一個對象,進入了Transient 狀態。也就是說:使用new 操作符初始化的對象不是立即就持久化的,它們的狀態是瞬時的,它們沒有任何跟資料庫表相關的行為,那麼只要程式不再調用這些對象,它們的狀態就會丟失,並且由記憶體回收機制回收。
    
        程式碼範例:       

         <span style="font-family:KaiTi_GB2312;font-size:18px;">//建立一個瞬態對象          User user = new User();          user.setName(userName);          user.setPassword("test");          //user仍是一個瞬態對象</span>
    

     2、Persist Object(持久化對象):持久執行個體是任何具有資料庫標識的執行個體。它被持久化管理器session統一管理,持久執行個體是在事務中進行操作的————它們的狀態在事務結束時同資料庫進行同步,當事務提交時,通過執行SQL的insert,update,和delete語句把記憶體中的狀態同步到資料庫中。
        代碼執行個體:      

                       //建立一個瞬態對象User user = new User();user.setName(userName);user.setPassword("test");//user仍是一個瞬態對象Session session = sessionFactory.openSession();Tansaction tx = session.beginTansaction();//此時user仍是一個瞬態對象session.save(user);//此時user已變為持久態
    

     3、Detached Object(離線對象):session關閉之後,持久化對象就變為離線對象,離線表示這個對象不能再與資料庫保持同步,不再受hibernate的管理。
       程式碼範例:       

           <span style="font-family:KaiTi_GB2312;font-size:18px;">//建立一個瞬態對象            User user = new User();            user.setName(userName);            user.setPassword("test");            //user仍是一個瞬態對象                        Session session = sessionFactory.openSession();            Tansaction tx = session.beginTansaction();            //此時user仍是一個瞬態對象            session.save(user);            //此時user已變為持久態            tx.commit();            session.close();     // clear()   evict()  3種變游離態            user對象已經變成游離態</span>

    注意: ORM的過程中,區分三態的標誌就是“是否被Session”管理。
    Transient ,detached的狀態都不被session管理,只有persistent被session管理,注意這裡的session是hibernate的session,不是http中使用者會話的session。實體物件處於Hibernate架構所管理的狀態,也就是說這個實體物件與session對象的執行個體相關,對這個實體所做的任何變更操作都將被Hibernate持久化到資料庫層。

    通過這個表格來說明三種狀態的區別:

   


二、hibernate三態之間的相互轉換


       還是這副圖,大家看看圖中的箭頭,三種狀態之間是可以相互轉換的。

     

     圖中,三態之間的轉換有兩種
    
        1、進入session,藍色的箭頭,被session管理。
            三個口:transient ,detached,transient之前。
            操作方法:修改:save ,saveorupdate ,lock;這樣不論是在transient,還是detached都可以轉換成 persistent狀態。
                   查詢:get,load,find,iterator()。
            
        
        2、出session,紅色箭頭不被session管理。
            一個口:persistent 。
            方法:evict,close,clear,delete。       
        

三、persistent 特殊說明

    
    1、直接調用到persistent。
    
    以上說明中,有一個特例就是:查詢:get,load,find,iterator()。所以hibernate的三態生命週期不包含查詢性質的操作,圖中明顯可以看到查詢語句從是可以從程式中,直接調用到persistent的。查詢只跟persistent相關。
    從一個執行個體中來說明:   

Session session = sessionFactory.openSession();Tansaction tx = session.beginTansaction();User user = (User) session.load(User.class,"key");   ------相當於hql  從DB讀出來的 當然是持久態//user對象已是持久太對象tx.commit();session.close();

   2、在persistent自動更新

       第一點說的是直接調到persistent,這裡說的是通過transitent,進入persistent後,進行的自動更新。看代碼如下:      

//建立一個瞬態對象  User user = new User();  user.setName(userName);  user.setPassword("test");  //user仍是一個瞬態對象Session session = sessionFactory.openSession();Tansaction tx = session.beginTansaction();//此時user仍是一個瞬態對象session.save(user);//此時user已變為持久態tx.commit();//persistent自動更新代碼Tansaction tx2 = session.beginTansaction();user.setPassword("pdw");tx2.commit();//雖然在這個事物中並沒有調用session的save()方法來儲存user對象,但是usr處於持久太,//所以對user對象所做的任何修改都持久化到資料庫中   ---------持久態自動更新//那麼資料庫中的密碼也變成了pdw               session.close();

     當user進入persistent後,我們可以直接對其進行set操作,因為本來就處在persistent,所以不用通過“save"或者“saveorupdate"來再次進入persistent。這就好比,我們買了遊樂園的通票去遊玩,只要進去了,就可以玩每個項目,不用每玩一個項目再出去買票了。


     這就是操作hibernate對象持久化到資料庫的一個流程,三個狀態,一個生命週期,狀態之間的相互轉換,他們都是遵循一定的“事物發展規律”。

     本篇部落格只是粗顯地介紹了基礎,是我們開發必須要知道瞭解的使用者手冊的一部分。當然還有API,詳細的記錄了hibernate包含的方法,特性,這裡就不在一一介紹,這些僅僅是入門,上手,還是需要多多的練習。

Hibernate持久化生命週期——三態

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.