日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

菜鸟学SSH(八)——Hibernate对象的三种状态

發(fā)布時(shí)間:2023/12/31 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 菜鸟学SSH(八)——Hibernate对象的三种状态 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前面寫了幾篇關(guān)于SSH的博客,但不是Struts就是Spring,Hibernate還從來沒寫過呢。說好是SSH的,怎么可以光寫那兩個(gè),而不寫Hibernate呢對(duì)吧。今天就先說說Hibernate對(duì)象的三種狀態(tài),Hibernate對(duì)象有三種狀態(tài),分別是:臨時(shí)態(tài)(Transient)、 持久態(tài)(Persistent)、游離態(tài)(Detached)。


臨時(shí)狀態(tài):是指從對(duì)象通過new語句創(chuàng)建到被持久化之前的狀態(tài),此時(shí)對(duì)象不在Session的緩存中。


處在此狀態(tài)的對(duì)象具備以下特點(diǎn):

1,不在Session緩存中,不與任何Session實(shí)例相關(guān)聯(lián)。

2,在數(shù)據(jù)庫(kù)中沒有與之對(duì)應(yīng)的記錄。


通常在下列情況下對(duì)象會(huì)進(jìn)入臨時(shí)狀態(tài):

1,通過new語句創(chuàng)建新對(duì)象。

2,執(zhí)行delete()方法,對(duì)于游離狀態(tài)的對(duì)象,delete()方法會(huì)將其與數(shù)據(jù)庫(kù)中對(duì)應(yīng)的記錄刪除;而對(duì)于持久化狀態(tài)的對(duì)象,delete()方法會(huì)將其與數(shù)據(jù)庫(kù)中對(duì)應(yīng)的記錄刪除,并將其在Session緩存中刪除。


例如:Object object = new Object();

此時(shí)object為臨時(shí)狀態(tài),數(shù)據(jù)庫(kù)中沒有對(duì)應(yīng)的數(shù)據(jù),Session緩存中也沒有相關(guān)聯(lián)的實(shí)例。


持久化狀態(tài):是指對(duì)象被持久化到Session對(duì)象被銷毀之前的狀態(tài),此時(shí)對(duì)象在Session的緩存中。


處在此狀態(tài)的對(duì)象具備以下特點(diǎn):

1,在Session緩存中,與Session實(shí)例相關(guān)聯(lián)。

2,在數(shù)據(jù)庫(kù)中有與之對(duì)應(yīng)的記錄。

3,Session在清理緩存的時(shí)候,會(huì)根據(jù)持久化對(duì)象的屬性變化更新數(shù)據(jù)庫(kù)。


通常在下列情況下對(duì)象會(huì)進(jìn)入臨時(shí)狀態(tài):

1,執(zhí)行save()或saveOrUpdate()方法,使臨時(shí)對(duì)象轉(zhuǎn)變?yōu)槌志没瘜?duì)象。

2,執(zhí)行upda()或saveOrUpdate()方法,使游離對(duì)象轉(zhuǎn)變?yōu)槌志没瘜?duì)象。

3,執(zhí)行l(wèi)oad()或get()方法,返回的對(duì)象都是持久化對(duì)象。

4,執(zhí)行find()方法,返回List集合中存放的都是持久化對(duì)象。

5,在允許級(jí)聯(lián)保存的情況下,Session在清理緩存時(shí)會(huì)把與持久化對(duì)象關(guān)聯(lián)的臨時(shí)對(duì)象轉(zhuǎn)變?yōu)槌志没瘜?duì)象。


例如:Session session = factory.openSession(); ?object.setName("持久化對(duì)象");?session.save(object);

此時(shí)object對(duì)象為持久化對(duì)象,Session緩存中有相關(guān)聯(lián)的實(shí)例,數(shù)據(jù)庫(kù)中有相應(yīng)的記錄。


游離狀態(tài):是指從持久化對(duì)象的Session對(duì)象被銷毀到該對(duì)象消失之前的狀態(tài),此時(shí)對(duì)象不在Session的緩存中。


處在此狀態(tài)的對(duì)象具備以下特點(diǎn):

1,不在Session緩存中,不與任何Session實(shí)例相關(guān)聯(lián)。

2,在數(shù)據(jù)庫(kù)中有與之對(duì)應(yīng)的記錄(前提是沒有其他Session實(shí)例刪除該條記錄)。


通常在下列情況下對(duì)象會(huì)進(jìn)入臨時(shí)狀態(tài):

1,執(zhí)行close()方法,將Session緩存清空,緩存中的所有持久化對(duì)象將轉(zhuǎn)變成游離對(duì)象。

2,執(zhí)行evict()方法,能從緩存中刪除一個(gè)持久化對(duì)象,使之轉(zhuǎn)變成游離對(duì)象。


例如:session.close();?

此時(shí)上文的object對(duì)象為游離對(duì)象,Session緩存中沒有有相關(guān)聯(lián)的實(shí)例,數(shù)據(jù)庫(kù)中有相應(yīng)的記錄。


三種狀態(tài)之間的轉(zhuǎn)換過程


對(duì)上圖的解析:

1,當(dāng)一個(gè)對(duì)象被new了以后此對(duì)象處于臨時(shí)態(tài)(Transient)。

2,然后對(duì)此對(duì)象執(zhí)行session的save() 或者saveOrUpdate()方法后,此對(duì)象被放入session的一級(jí)緩存進(jìn)入持久態(tài)。

2,當(dāng)再對(duì)此對(duì)象執(zhí)行evict()/close()/clear()的操作后此對(duì)象進(jìn)入游離態(tài)(Detached)。

4,游離態(tài)(Detached)和臨時(shí)態(tài)(Transient)的對(duì)象由于沒有被session管理會(huì)在適當(dāng)?shù)臅r(shí)機(jī)被java的垃圾回收站(garbage)回收。

5,執(zhí)行session的get()/load()/find()/iternte()等方法從數(shù)據(jù)庫(kù)里查詢的到的對(duì)象,處于持久態(tài)(Persistent)。

6,當(dāng)對(duì)數(shù)據(jù)庫(kù)中的紀(jì)錄進(jìn)行update()/saveOrUpdate()/lock()操作后游離態(tài)的對(duì)象就過渡到持久態(tài)。

7,處于持久態(tài)(Persistent)與游離態(tài)(Detached)的對(duì)象在數(shù)據(jù)庫(kù)中都有對(duì)應(yīng)的記錄。

8,臨時(shí)態(tài)(Transient)與游離態(tài)(Detached)的對(duì)象都可以被回收可是臨時(shí)態(tài)的對(duì)象在數(shù)據(jù)庫(kù)中沒有對(duì)應(yīng)的紀(jì)錄,而游離態(tài)的對(duì)象在數(shù)據(jù)庫(kù)中有對(duì)用的紀(jì)錄。


三種狀態(tài)在程序的轉(zhuǎn)換過程:


代碼

對(duì)象的生命周期狀態(tài)

對(duì)象的狀態(tài)

Object object = new Object();

開始生命周期

開始生命周期

Session session = factory.openSession();?
Transaction tx = session.beginTransaction();?

在生命周期中

臨時(shí)狀態(tài)

session.save(object);

在生命周期中

轉(zhuǎn)變?yōu)槌志没癄顟B(tài)

tx.commit();

在生命周期中

持久化狀態(tài)

session.close();?

在生命周期中

轉(zhuǎn)變?yōu)橛坞x狀態(tài)

System.out.println(object.getName());?

在生命周期中

游離狀態(tài)

object = null;

結(jié)束生命周期

結(jié)束生命周期

?

三種狀態(tài)里面,只有持久化狀態(tài)在Session緩存中有相關(guān)聯(lián)的實(shí)例,臨時(shí)狀態(tài)跟游離狀態(tài)都沒有。臨時(shí)狀態(tài)數(shù)據(jù)庫(kù)里沒有對(duì)應(yīng)的記錄,其他兩種可能又記錄,也可能沒有記錄。

好了,Hibernate對(duì)象的三種狀態(tài)就說到這里,接下來可能跟大家說說Hibernate的Session,期待不?





總結(jié)

以上是生活随笔為你收集整理的菜鸟学SSH(八)——Hibernate对象的三种状态的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。