Hibernate總結——持久化對象

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/lidonglong121/article/details/8744237

作者:李東龍

       數據持久化:就是將內存中的數據模型轉換爲存儲模型,以及將存儲模型轉換爲內存中的數據模型的統稱。數據模型可以是任何數據結構或對象模型,存儲模型可以是關係模型、XML、二進制流等。


       在上篇博客中就寫到的該內容,http://blog.csdn.net/lidonglong121/article/details/8669975。本篇博客要從Hibernate實現數據持久化的實現上做一下分析。

 

       咱們先來看看下面這張圖吧:

 

       在這張圖中同展現了三個數據狀態和一些數據處理。

       三種狀態有:臨時狀態(Transient)、持久化狀態(Persist)、離線狀態(Detached),因爲Hibernate是以面向對象的方式對數據進行持久化的,所以又有如下三種對象的概念:臨時對象(TransientObjects)、持久化對象(Persist Objects)、離線對象(Detached Objects)。

      

        我們來很簡單的認識一下這三種狀態,首先這三種狀態都是對於Hibernate或者說是對Session而言的。

        臨時狀態(Transient):使用new操作符初始化的對象。他們的狀態是瞬時的,也就是說他們沒有任何跟數據庫表相關聯的行爲,只要應用不再引用這些對象(不再被任何其他對象所引用),他們的狀態將會丟失,並由垃圾回收機制回收。

        持久化狀態(Persist):持久實例是任何具有數據庫標識的實例。它有持久化管理器Session統一管理,持久實例是在事務中進行操作的———他們的狀態在事務結束時同數據庫進行同步。當事務提交時,通過執行SQLINSERT,UPDATEDELETE語句把內存中的狀態同步到數據庫中。

        離線狀態(Detached):Session關閉之後,持久化對象就變爲離線對象。離線表示這個對象不能再與數據庫保持同步,他們不再受Hibernate管理。

        

        Hibernate中通過那些操作會出現如上的三種狀態呢?其實在圖中已經表現的非常清晰了:

 

       臨時對象(Transient Objects):

(1) 當通過new語句剛創建了一個Java對象,它處於臨時狀態,此時不和數據庫中的任何記錄對應。

(2) Sessiondelete()方法能使一個持久化對象或遊離對象轉變爲臨時對象。對於遊離對象,delete()方法從數據庫中刪除與它對應的記錄;對於持久化對象,delete()方法從數據庫中刪除與它對應的記錄,並且把它從Session的緩存中刪除。


        持久化對象(Persist Objects):

(1) Sessionsave()方法把臨時對象轉變爲持久化對象。

(2) Sessionload()get()方法返回的對象總是處於持久化狀態。

(3) Sessionfind()方法返回的List集合中存放的都是持久化對象。

(4) Sessionupdate()saveOrUpdate()lock()方法使遊離對象轉變爲持久化對象。

(5)當一個持久化對象關聯一個臨時對象,在允許級聯保存的情況下,Session在清理緩存時會把這個臨時對象也轉變爲持久化對象。


         離線對象(Detached Objects):

         遊離對象與臨時對象的相同之處在於,兩者都不被Session關聯,因此Hibernate不會保證它們的屬性變化與數據庫保持同步。遊離對象與臨時對象的區別在於:前者是由持久化對象轉變過來的,因此可能在數據庫中還存在對應的記錄,而後者在數據庫中沒有對應的記錄。
        Session
的以下方法使持久化對象轉變爲遊離對象:

(1) 當調用Sessionclose()方法時,Session的緩存被清空,緩存中的所有持久化對象都變爲遊離對象。如果在應用程序中沒有引用變量引用這些遊離對象,它們就會結束生命週期。

(2)Sessionevict()方法能夠從緩存中刪除一個持久化對象,使它變爲遊離狀態。當Session的緩存中保存了大量的持久化對象,會消耗許多內存空間,爲了提高性能,可以考慮調用evict()方法,從緩存中刪除一些持久化對象。但是多數情況下不推薦使用evict()方法,而應該通過查詢語言,或者顯式的導航來控制對象圖的深度。

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章