天天看點

Hibernate 對象的三種狀态

Hibernate 對象的三種狀态

瞬時(transient):

由new操作符建立,且尚未與Hibernate Session關聯的對象被認定為瞬時(Transient)的。瞬時(Transient)對象不會被持久化到資料庫中,也不會被賦予持久化辨別(identifier)。如果瞬時(Transient)對象在程式中沒有被引用,它會被垃圾回收器(garbage collector)銷毀。使用Hibernate Session可以将其變為持久(Persistent)狀态。(Hibernate會自動執行必要的SQL語句)。

瞬時狀态的特點有:

1、 與資料庫中的記錄沒有任何關聯,也就是沒有與其相關聯的資料庫記錄。

2、 與Session沒有任何關系,也就是沒有通過Session對象的執行個體對其進行任何持久化的操作。

舉例:

User user=new User(); //user是一個瞬時對象,在資料庫的表中是沒有記錄和該對象相對應的。和session沒有關系。

user.setName(“ddd”);

user.setBirthday(new Date());

session.save(user); //持久化狀态

持久(persistent):

資料庫中有資料與之對應,目前與session有關聯,并且相關聯的session沒有關閉,事務沒有送出;持久對象狀态發生改變,在事務送出時會影響到資料(Hibernate能檢測到)。

持久(Persistent)是執行個體在資料庫中有對應的記錄,并擁有一個持久化辨別(identifier)。持久(Persistent)的執行個體可能是剛被儲存的,或剛被加載的,無論哪一種,按定義,它存在于相關聯的Session作用範圍内。Hibernate會檢測到處于持久(Persistent)狀态的對象的任何改動,在目前操作單元(unit of work)執行完畢時将對象資料(state)與資料庫同步(synchronize)。開發者不需要手動執行Update。将對象從持久(Persistent)狀态程式設計瞬時(Transient)狀态同樣也不需要手動執行delete語句。

持久對象具有如下特點:

1、 和session執行個體關聯;

2、 在資料庫中有與之關聯的記錄。

3、 Hibernate會根據持久态對象的屬性的變化而改變資料庫中的相應記錄。

脫管/遊離(detached):資料庫中有資料與之對應,但沒有session與之關聯,脫管對象狀态發生改變,hibernate不能檢測到。

脫管狀态:

與持久(Persistent)狀态對象關聯的Session被關閉後,對象就變為脫管(Detached)的。對脫管(Detached)對象的引用依然有效,對象可繼續被修改。脫管(Detached)對象如果重新關聯到某個新的Session上,會再次轉變為持久(Transistent)的(在脫管Detached其間的改動将被持久化到資料庫)。這個功能使得一種程式設計模型,即中間會給使用者思考時間(user think-time)的長時間運作的操作單元(unit of work).

脫管對象擁有資料庫的識别值,可通過update()、saveOrUpdate()等方法,轉變成持久對象。

脫管對象具有如下特點:

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

2、 比瞬時對象多了一個資料庫記錄辨別值。

3、 不在于Session相關聯。

4、 脫管對象一定是由持久态對象轉化而來。

首先是我們的UML圖轉換:以及解析:

Hibernate 對象的三種狀态

對以上圖形的解析:

1、當一個對象被new了以後此對象處于瞬時态(Transient);

2、然後對此對象執行session的save() 或者saveOrUpdate()方法後,此對象被放入session的一級緩存進入持久态.

2、當再對此對象執行evict()/close()/clear()的操作後此對象進入遊離态(Detached)

4、遊離态(Detached)和瞬時态(Transient)的對象由于沒有被session管理會在适當的時機被java的垃圾資源回收筒(garbage)回收.

5、執行session的get()/load()/find()/iternte()等方法從資料庫裡查詢的到的對象,處于持久态(Persistent).

6、當對資料庫中的紀錄進行update()/saveOrUpdate()/lock()操作後遊離态的對象就過渡到持久态

7、處于持久态(Persistent)與遊離态(Detached)的對象在資料庫中都有對應的記錄.

8、瞬時态(Transient)與遊離态(Detached)的對象都可以被回收可是瞬時态的對象在資料庫中沒有對應的紀錄,而遊離态的對象在資料庫中有對用的紀錄。

1、操縱持久化對象-save()

(1)Session 的 save() 方法使一個臨時對象轉變為持久化對象

(2)Session 的 save() 方法完成以下操作:

(3)把 News 對象加入到 Session 緩存中, 使它進入持久化狀态

(4)選用映射檔案指定的辨別符生成器, 為持久化對象配置設定唯一的 OID. 在使用代理主鍵的情況下, setId() 方法為 News 對象設定 OID 使無效的.

(5)計劃執行一條 insert 語句,把Customer對象目前的屬性值組裝到insert語句中

(6)Hibernate 通過持久化對象的 OID 來維持它和資料庫相關記錄的對應關系. 當 News 對象處于持久化狀态時, 不允許程式随意修改它的 ID

2、 操縱持久化對象-update()

(1)Session 的 update() 方法使一個遊離對象轉變為持久化對象, 并且計劃執行一條 update 語句.

Hibernate 對象的三種狀态

3、操縱持久化對象-saveOrupdate()

saveOrUpdate:

該方法同時包含save和update方法,如果參數是臨時對象就用save方

法,如果是遊離對象就用update方法,如果是持久化對象就直接傳回。

如果參數是臨時對象就用save方法

Hibernate 對象的三種狀态

如果是遊離對象就用update方法

Hibernate 對象的三種狀态

如果是持久化對象就直接傳回,不執行操作

Hibernate 對象的三種狀态