【SSH】——Hibernate(1)持久化對象轉換

      一、Hibernate生命週期


      實體對象的生命週期在Hibernate應用中是一個很關鍵的概念,正確的理解實體對象的生命週期將對我們應用Hibernate做持久層設計起到很大的作用.而所謂的實體對象的生命週期就是指實體對象由產生到被GC回收的一段過程.在這過程中我們需要理解的就是實體對象生命週期中的三種狀態.瞬時狀態(Transient)、持久化狀態(Persistent)和離線狀態(Detached也叫做脫管狀態)。


               


      二、三種狀態


      1、瞬時狀態(Transient)

      使用new操作符初始化對象,並不是立刻就持久。在沒有保存爲數據庫中的任何一個數據的時候,他們的狀態都是瞬時的。或者說他們沒有任何跟數據庫表相關聯的行爲,也沒有主鍵值,只要應用不再引用這些對象,他們的狀態將會丟失,並由垃圾回收機制回收。如:


public void TestA{
	//這裏的user對象,與數據庫中的記錄沒有任何關聯
	TUser user=new TUser();
	user.setName("yxm");
}

      特點:不和任何一個Session實例關聯。在數據庫中沒有對應的記錄。


      2、持久化狀態(Persistent)

      保存到數據庫中後或者從數據庫中取出的數據封裝爲對象,此時內存中的對象和數據庫中的記錄有對應關係,即和Session對象相關且Session對象尚未關閉,則此時實體對象處於Persistent狀態。如果此時Session對象的delete方法刪除記錄,則Persistent狀態的對象因爲失去了對應資料,將會變成Transient狀態。持久化對象由Session統一管理,持久實例是在事務中進行操作的——它們的狀態在事務結束的時候同數據庫進行同步。如:


<span style="font-family:Microsoft YaHei;font-size:18px;">TUser user=new TUser();
TUser anotherUser=new TUser();
user.setName("yxm");
anotherUser.setName("Judy");
//此時user和anotherUser都處於Transient狀態
Transaction tx=session.beginTransaction();
session.save(user);
//此時的user對象已經由hibernate納入實體管理容器,處於persistent狀態
//anotherUser仍是transient狀態
tx.commit();
//事務提交後,數據庫中插入一條用戶yxm的記錄,對anotheruser沒有任何操作

Transaction tx1=session.beginTransaction();
user.setName("yxm_1");   //persistent
anotherUser.setName("Judy_1"); //transient

tx1.commit();
//雖然tx1事務中沒有顯示調用session.save方法保存user對象
//但是由於處於persistent狀態的對象將自動被固化到數據庫中,因此
//user對象的變化也將被同步到數據庫中
//yxm的用戶記錄已經被更新爲“yxm_1”

//時anotherUser仍然是一個普通java對象,處於transient狀態,不受hibernate框架管理
//因此其屬性的更改也不會對數據庫產生影響
</span>

      可以看到,處於transient狀態的實體對象,可以通過session.save方法轉換爲persistent狀態。同樣,如果一個實體對象是由session.load方法獲得,也處於persistent狀態。

      特點:持久化對象總是被一個session實例關聯。和數據庫中的相關記錄對應。session在清理緩存時,會持久化對象的屬性變化,來同步更新數據庫。


      3、託管狀態(Detached)

      Session關閉之後,持久化對象就變成detached對象。表示這個對象不能再與數據庫保持同步,他們不再受到Hibernate管理。位於Detached狀態的對象可以使用update方法使之與數據庫中的記錄重新發生關聯,此時Detached狀態的對象將變爲Persistent狀態。如:

<span style="font-family:Microsoft YaHei;">TUser user=new TUser();
user.setName("yxm");
//此時user處於transient狀態

Transaction tx=session.beginTransaction();
session.save(user);
//此時的user對象已經由hibernate納入實體管理容器,處於persistent狀態
tx.commit();

session.close();
//user對象此時狀態爲detached,以爲與其關聯的session已經關閉

Transaction tx1=session2.beginTransaction();
session2.update(user);
//此時處於detached狀態的user對象再次藉助session2由hibernate納入管理器,回覆persistent狀態
user.setName("yxm_1");
//由於user對象再次處於persistent狀態,因此其屬性變更將自動由hibernate固化到數據庫中
tx1.commit();
</span>

      特點:不再位於session的緩存中,即它不再和session關聯。它擁有持久化標識。

      總結:

      Transient和Detached狀態的對象都不收hibernate持久層所管理,對這兩個狀態中的對象做任何屬性的改變都不會對數據庫中的資料有任何的影響。但是兩者有什麼區別呢?

      detached狀態的對象,在執行save方法時,已經對對象進行了持久化,並賦予其主鍵值,可以唯一確定數據庫表中的一條記錄,能和數據庫表中具備相同id值的記錄相關聯。只不過由於detached對象脫離了session這個數據操作平臺,其狀態改變無法更新到數據庫中。而transient狀態的對象與數據缺乏對應關係。

發佈了120 篇原創文章 · 獲贊 10 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章