更新時(shí)間:2023-11-16 來(lái)源:黑馬程序員 瀏覽量:
Hibernate是持久層的ORM框架,專(zhuān)注于數(shù)據(jù)的持久化工作。在進(jìn)行數(shù)據(jù)持久化操作時(shí),持久化對(duì)象可能處于不同的狀態(tài)中。這些狀態(tài)可分為三種,分別為瞬時(shí)態(tài)、持久態(tài)和脫管態(tài)。下面分別針對(duì)這三種狀態(tài)進(jìn)行簡(jiǎn)單介紹。
瞬時(shí)態(tài)也稱(chēng)為臨時(shí)態(tài)或者自由態(tài),瞬時(shí)態(tài)的對(duì)象是由new關(guān)鍵字開(kāi)辟內(nèi)存空間的對(duì)象,不存在持久化標(biāo)識(shí)OID(相當(dāng)于主鍵值),且未與任何的Session實(shí)例相關(guān)聯(lián),在數(shù)據(jù)庫(kù)中也沒(méi)有記錄,失去引用后將被JVM回收。瞬時(shí)對(duì)象在內(nèi)存孤立存在,它是攜帶信息的載體,不和數(shù)據(jù)庫(kù)的數(shù)據(jù)有任何關(guān)聯(lián)關(guān)系。
持久態(tài)的對(duì)象存在一個(gè)持久化標(biāo)識(shí)OID,當(dāng)對(duì)象加入到Session緩存中時(shí),就與Session實(shí)例相關(guān)聯(lián)。它在數(shù)據(jù)庫(kù)中存在與之對(duì)應(yīng)的記錄,每條記錄只對(duì)應(yīng)唯一的持久化對(duì)象。需要注意的是,持久化對(duì)象是在事務(wù)還未提交前變成持久態(tài)的。
脫管態(tài)也稱(chēng)離線態(tài)或者游離態(tài),當(dāng)持久化對(duì)象與Session斷開(kāi)時(shí)就變成了脫管態(tài),但是脫管態(tài)依然存在持久化標(biāo)識(shí)OID,只是失去了與當(dāng)前Session的關(guān)聯(lián)。需要注意的是,脫管態(tài)對(duì)象發(fā)生改變時(shí)Hibernate是不能檢測(cè)到的。
在Hibernate運(yùn)行時(shí),持久化對(duì)象的三種狀態(tài)是可以通過(guò)一系列的方法進(jìn)行轉(zhuǎn)換的。這三種狀態(tài)之間的轉(zhuǎn)換關(guān)系具體如圖24-1所示。
圖24-1 持久化對(duì)象的狀態(tài)轉(zhuǎn)換
從圖24-1中可以看出,當(dāng)一個(gè)對(duì)象通過(guò)new關(guān)鍵字創(chuàng)建后,該對(duì)象處于瞬時(shí)態(tài);當(dāng)對(duì)瞬時(shí)態(tài)對(duì)象執(zhí)行Session的save()或saveOrUpdate()方法后,該對(duì)象將被放入Session的一級(jí)緩存之中,此時(shí)該對(duì)象處于持久態(tài);當(dāng)對(duì)持久態(tài)對(duì)象執(zhí)行evict()、close()或clear()操作后,對(duì)象會(huì)進(jìn)入脫管態(tài);當(dāng)直接執(zhí)行Session的get()、load()、find()或iterate()等方法從數(shù)據(jù)庫(kù)中查詢出對(duì)象時(shí),查詢到的對(duì)象也會(huì)處于持久態(tài);當(dāng)對(duì)數(shù)據(jù)庫(kù)中的記錄進(jìn)行update()、saveOrUpdate()以及l(fā)ock()等操作后,此時(shí)脫管態(tài)的對(duì)象就會(huì)過(guò)渡到持久態(tài);由于瞬時(shí)態(tài)和脫管態(tài)的對(duì)象不在session的管理范圍內(nèi),所以會(huì)在一段時(shí)間后被JVM回收。
本文版權(quán)歸黑馬程序員Java培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!
作者:黑馬程序員Java培訓(xùn)學(xué)院
首發(fā):https://java.itheima.com