天天看點

hibernate5(7)操縱對象入門[2]四大對象狀态分析狀态類型狀态特征

在hibernate中,java對象的聲明周期對應有4種狀态:

狀态

說明

瞬時(transient)

由new操作符建立,且尚未與hibernate session 關聯的對象被認定為瞬時(transient)的。瞬時(transient)對象不會(在清理session時)被持久化到資料庫中,也不會被賦予持久化辨別(identifier)。使用hibernate session可以将其變為持久(persistent)狀态。(hibernate會自動執行必要的sql語句)

持久(persistent)

持久(persistent)的執行個體在資料庫中有對應的記錄,并擁有一個持久化辨別(identifier)。 持久(persistent)的執行個體可能是剛被儲存的,或剛被加載的,無論哪一種,按定義,它存在于相關聯的session作用範圍内。 hibernate會檢測到處于持久(persistent)狀态的對象的任何改動,在清理session時将對象資料(state)與資料庫同步(synchronize)。我們不需要手動執行update。将對象從持久(persistent)狀态變成瞬時(transient)狀态同樣也不需要手動執行delete語句,也會将資料庫中相應對象删除。

脫管(detached),也叫遊離

與持久(persistent)對象關聯的session被關閉後,對象就變為脫管(detached)的。 對脫管(detached)對象的引用依然有效,對象可繼續被修改。脫管(detached)對象如果重新關聯到某個新的session上, 會再次轉變為持久(persistent)的(在detached其間的改動将被持久化到資料庫)。這在現實開發場景中頗有意義,如果我們某個對象屬性要等待使用者輸入修改,可以先關閉session,釋放資料庫資源,在擷取到使用者修改資訊後,再将此對象關聯到新的session中更新資料庫

删除(removed)

session将要對象從資料庫中删除,但此時在程式中改對象仍存在,變為removed狀态,如對使用級聯删除user,則其對應article對象也會被删除

下列這張圖檔展示了在hibernate操作中對象狀态的轉換關系

hibernate5(7)操縱對象入門[2]四大對象狀态分析狀态類型狀态特征

下面是這4種狀态的相應特征

對象狀态

狀态特征

臨時對象(transient)

在使用代理主鍵的情況下,oid 通常為 null

2. 不處于 session 的緩存中

3. 在資料庫中沒有對應的記錄

持久化對象(也叫”托管”)(persist)

oid 不為 null

2. 位于 session 緩存中

3. 若在資料庫中已經有和其對應的記錄,持久化對象和資料庫中的相關記錄對應

4. session 在 flush 緩存時,會根據持久化對象的屬性變化,來同步更新資料庫

5. 在同一個 session 執行個體的緩存中,資料庫表中的每條記錄隻對應唯一的持久化對象

删除對象(removed)

在資料庫中沒有和其 oid 對應的記錄

2. 不再處于 session 緩存中

3. 一般情況下,應用程式不該再使用被删除的對象

遊離對象(也叫”脫管”) (detached)

3. 一般情況需下,遊離對象是由持久化對象轉變過來的,是以在資料庫中可能還存在與它對應的記錄

在下一篇文章裡,我們會介紹如何通過session接口操縱各種對象狀态,通過零sql語句,完成相應的資料庫增删改查操作。