1. 程式人生 > >Hibernate中對象的三種狀態

Hibernate中對象的三種狀態

less val ssi action 之前 一個數據庫 cti 事務提交 color

一 . 在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)比瞬時對象多了一個數據庫記錄標識值.

示例:

  

package cn.et.hibernate.lesson01;

public class Test {
    public static void main(String[] args) {
        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的緩存中刪除一個持久對象。

Hibernate中對象的三種狀態