天天看點

Hibernate對象的三種狀态

在Hibernate中,對象有三種狀态:臨 時狀态(Transient)、持久狀态(Persistent)和遊離狀态(Detached)。

處于持久态的對象也稱為PO(PersistenceObject),臨時對象和遊離對象也稱為VO(ValueObject).

1. 臨時狀态

由new指令開辟記憶體空間的java對象,例如:

User  user=new User();

臨時對象在記憶體孤立存在,它是攜帶資訊的載體,不和資料庫的資料有任何關聯關系.

(a)如 果沒有變量對該對象進行引用,它将被gc回收;

(b)在Hibernate中,可通過session的save()或saveOrUpdate()方法将瞬時對象與資料庫相關聯,并将資料對應的插入資料庫中,此時該臨時對象轉變成持久化對 象.

2. 持久狀态

處于該狀态的對象在資料庫中具有對應的記錄,并擁有一個持久化辨別.通過session的get()、load()等方法獲得的對象都是持久對象。

持久化對象被修改變更後,不會馬上同步到資料庫,直到資料庫事務送出。在同步之前,持久化 對象是髒的(Dirty)。

(a)如果是用hibernate的delete()方法,對應的持久對象就變成臨時對象,因資料庫中 的對應資料已被删除,該對象不再與資料庫的記錄關聯.

(b)當一個session執行close()或clear()、evict()之後,持久對象變成遊離對象,此時該對象雖然具有資料庫識别值,但它已不在HIbernate持久層的管理之下.

持久對象具有如下特點:

(1)和session執行個體關聯;

(2)在資料庫中有與之關聯的記錄,并 擁有持久化辨別.

3. 遊離狀态

當與某持久對象關聯的session被關閉後,該持久對象轉變為遊離對象.當遊離對象被重新關聯到session上 時,又再次轉變成持久對象(在Detached其間的改動将被持久化到資料庫中)。遊離對象擁有資料庫的識别值,但已不在持久化管理範圍之内。

(a)通 過update()、saveOrUpdate()等方法,遊離對象可轉變成持久對象.

(b)如果是用hibernate的delete()方法,對應的遊離對象就變成臨時對象,因資料庫中的 對應資料已被删除,該對象不再與資料庫的記錄關聯.

(c)在沒有任何變量引用它時,它将被gc在适當的 時候回收;

遊離對象具有如下特點:

(1)本質上與瞬時對象相同,在沒有任何變量引用它時,JVM會在适當的時候将它回收;

(2)比瞬時對象多了一個資料庫記錄辨別值.

示例:

Session session=factory.openSession();

User user=new User();

//user對象處于臨時狀态。

user.setName("張三");

user.setAge(18);

Transaction tran=Session.beginTransaction();

session.save(user);

//user對象轉化為持 久狀态。

tran.commit();

session.close();

//user對象轉化為遊離狀态。

user.setName("李四");

Session session2=factory.openSession();

Transaction  tran2=Session2.beginTransaction();

Session2.update(user);

//user對象 轉化為持久狀态。

tran2.commit();(遊離狀态中對象的變動在再次持久時會被持久化到資料庫)

Transaction  tran3=Session.beginTransaction();

Session2.delete(user);

//user對象轉 化為臨時狀态。

tran3.commit();

session2.close();

Session的不同操作對對象狀态的影響:

Session的save()方法

save()方法将一個臨時對象轉變為持久對象。

Session的update()方法

update()方法 将一個遊離對象轉變為持久對象。

Session的lock()方法

調用lock()方法将對象同Session相關聯而不強制更新。

Session的merge()方法

拷貝指定對象的狀态到具有相同對象辨別符的持久對象。

Session的saveOrUpdate()方法

saveOrUpdate()方法對于臨時對象,執行save()方法,對于遊離對象,執行update()方法。

Session的load()和get()方法

load()方法和get()方法都可以根據對象的辨別符加載對象,這兩個方法加載的對象都位于Session的緩存中,屬于持久對象。

Session的delete()方法

delete()方法用于從資料庫中删除與持久化對象對應的記錄。如果傳入的是一個持久化對象,Session就執行一條delete語句。如果傳入的參數是遊離對象,先使分離對象與Session關聯,使它變為持久化對象,然後才計劃執行一個delete語句。

Session的evict()方法

evict()方法從Session的緩存中删除一個持久對象。

原文來源 http://blog.csdn.net/xinyu0100/article/details/5619715