首頁常見問題正文

Java培訓:持久化對象的狀態(tài)及狀態(tài)轉換

更新時間:2023-11-16 來源:黑馬程序員 瀏覽量:

IT培訓班

  Hibernate是持久層的ORM框架,專注于數據的持久化工作。在進行數據持久化操作時,持久化對象可能處于不同的狀態(tài)中。這些狀態(tài)可分為三種,分別為瞬時態(tài)、持久態(tài)和脫管態(tài)。下面分別針對這三種狀態(tài)進行簡單介紹。

  1.瞬時態(tài)(transient)

  瞬時態(tài)也稱為臨時態(tài)或者自由態(tài),瞬時態(tài)的對象是由new關鍵字開辟內存空間的對象,不存在持久化標識OID(相當于主鍵值),且未與任何的Session實例相關聯,在數據庫中也沒有記錄,失去引用后將被JVM回收。瞬時對象在內存孤立存在,它是攜帶信息的載體,不和數據庫的數據有任何關聯關系。

  2.持久態(tài)(persistent)

  持久態(tài)的對象存在一個持久化標識OID,當對象加入到Session緩存中時,就與Session實例相關聯。它在數據庫中存在與之對應的記錄,每條記錄只對應唯一的持久化對象。需要注意的是,持久化對象是在事務還未提交前變成持久態(tài)的。

  3.脫管態(tài)(detached)

  脫管態(tài)也稱離線態(tài)或者游離態(tài),當持久化對象與Session斷開時就變成了脫管態(tài),但是脫管態(tài)依然存在持久化標識OID,只是失去了與當前Session的關聯。需要注意的是,脫管態(tài)對象發(fā)生改變時Hibernate是不能檢測到的。

  在Hibernate運行時,持久化對象的三種狀態(tài)是可以通過一系列的方法進行轉換的。這三種狀態(tài)之間的轉換關系具體如圖24-1所示。

1700099780767_持久化對象的狀態(tài)轉換.jpg

  圖24-1 持久化對象的狀態(tài)轉換

  從圖24-1中可以看出,當一個對象通過new關鍵字創(chuàng)建后,該對象處于瞬時態(tài);當對瞬時態(tài)對象執(zhí)行Session的save()或saveOrUpdate()方法后,該對象將被放入Session的一級緩存之中,此時該對象處于持久態(tài);當對持久態(tài)對象執(zhí)行evict()、close()或clear()操作后,對象會進入脫管態(tài);當直接執(zhí)行Session的get()、load()、find()或iterate()等方法從數據庫中查詢出對象時,查詢到的對象也會處于持久態(tài);當對數據庫中的記錄進行update()、saveOrUpdate()以及l(fā)ock()等操作后,此時脫管態(tài)的對象就會過渡到持久態(tài);由于瞬時態(tài)和脫管態(tài)的對象不在session的管理范圍內,所以會在一段時間后被JVM回收。

  本文版權歸黑馬程序員Java培訓學院所有,歡迎轉載,轉載請注明作者出處。謝謝!

  作者:黑馬程序員Java培訓學院

  首發(fā):https://java.itheima.com

分享到:
在線咨詢 我要報名
和我們在線交談!