標籤:ceo 強制 執行個體 hibernate javaee set begin nbsp 持久層
Hibernate中Java對象的三種狀態
在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()方法。
Hibernate 小章總結(二)