天天看點

hibernate持久化對象的三個狀态

              hibernate中的對象有3種狀态,瞬時對象(transientobjects)、持久化對象(persistentobjects)和離線對象(detachedobjects也叫做脫管對象)。這三個狀态的主要差別在兩方面:1、session;2、資料庫

hibernate持久化對象的三個狀态

           下面說一下不同狀态的特征:

           1、transient (瞬态)

            通過session的save()方法和saveorupdate()方法可以把一個臨時對象和資料庫相關聯,并把臨時對象攜帶的資訊通過配置檔案所做的映射插入資料庫中,這個臨時對象就成為持久化對象。

           通過session對象的save()方法進行儲存處于瞬時态的對象後,該對象就變為持久态。此時session中已經存在該對象,并且對應資料庫中的一條記錄。

          在調用save()方法後,持久化對象user就變為持久态,但是執行了commit()方法之後,資料庫操作才會進行。

          3、detached(遊離态或脫管态)

   脫管對象雖然擁有使用者的辨別id,是以通過update()、saveorupdate()等方法,再次與持久層關聯。

        二、session的get和load的差別

   我們在說這三态是引入了session,那為什麼要用它呢?    

      1、減少通路資料庫的頻率,可以提高資料庫通路的性能。

      2、保證緩存中的對象與資料庫中的相關記錄保持同步。

      3、當緩存中的持久化對象(位于緩存中的對象)之間存在循環關聯關系時,sessioin會保證不出現通路對象的死循環。

   get和load最大的差別,就是用get方法執行查詢,會在執行get時馬上查出,而load呢則是什麼時候需要這些資料才會進行查詢,也就是說load的特點是延遲加載。lazy是通過實作代理對象實作,代理對象主要采用的是cglib庫生成的,采用的是繼承方式。不同于jdk中的代理。

 另外,這兩個方法的差別就是:如果查詢的資料為空,那麼get方式傳回null,而load方式會抛出objectnotfoundexception異常