Hibernate中的Java對(duì)象在他的生命周期中榨馁,可處于以下四個(gè)狀態(tài)之一庄撮。
1.臨時(shí)狀態(tài)(Transient):剛用new語句創(chuàng)建凹嘲,還沒有被持久化堂飞,并且不處于Session的緩存中昼接。處于臨時(shí)狀態(tài)的Java對(duì)象被稱為臨時(shí)對(duì)象爽篷。
2.持久化狀態(tài)(persistent):已經(jīng)被持久化,并且加入到Session緩存中慢睡。處于持久化狀態(tài)的Java對(duì)象被稱為持久化對(duì)象逐工。
3.刪除狀態(tài)(removed):不再處于Session的緩存中,并且Session已經(jīng)計(jì)劃將其從數(shù)據(jù)庫中刪除漂辐。處于刪除狀態(tài)的Java對(duì)象被稱為被刪除對(duì)象泪喊。
4.游離狀態(tài)(detached):已經(jīng)被持久化,但不再處于Session的緩存中髓涯。處于游離態(tài)的Java對(duì)象被稱為游離對(duì)象袒啼。
臨時(shí)對(duì)象的特征:
1.在使用代理主鍵的情況下,OID通常為NULL纬纪。
2.不處于Session的緩存中蚓再,也可以說,不被任何一個(gè)Session實(shí)例關(guān)聯(lián)包各。
3.在數(shù)據(jù)庫中沒有對(duì)應(yīng)的記錄摘仅。
在以下情況下,Java對(duì)象進(jìn)入臨時(shí)狀態(tài)问畅。
1.當(dāng)通過new語句剛創(chuàng)建了一個(gè)Java對(duì)象娃属,它處于臨時(shí)狀態(tài),此時(shí)不和數(shù)據(jù)庫中的任何記錄對(duì)應(yīng)护姆。
2.在Hibernate的配置文件中的hibernate.use_identifier_roll_backz屬性為true的情況下矾端,Session的delete()方法能使一個(gè)持久化對(duì)象或游離對(duì)象轉(zhuǎn)變?yōu)榕R時(shí)對(duì)象。
持久化對(duì)象的特征:
1.OID不為null卵皂。
2.位于一個(gè)Session實(shí)例的緩存中须床,也可以說,持久化對(duì)象總是被一個(gè)Session實(shí)例關(guān)聯(lián)渐裂。
3.持久化對(duì)象和數(shù)據(jù)庫中的相關(guān)記錄對(duì)應(yīng)豺旬。
4.Session在清理緩存時(shí),會(huì)根據(jù)持久化對(duì)象的屬性變化柒凉,來同步更新數(shù)據(jù)庫族阅。
Session的許多方法都能夠使Java對(duì)象轉(zhuǎn)變?yōu)槌志没瘜?duì)象:
1.Session的save()方法把臨時(shí)對(duì)象轉(zhuǎn)變?yōu)槌志没瘜?duì)象。
2.Session的load()方法或get()方法返回的對(duì)象總是處于持久化狀態(tài)膝捞。
3.Query的list()方法返回的List集合中存放的都是持久化對(duì)象坦刀。
4.Session的update()、saveOrUpdate()和lock()方法使游離對(duì)象轉(zhuǎn)變?yōu)槌志没瘜?duì)象蔬咬。
5.當(dāng)一個(gè)持久化對(duì)象關(guān)聯(lián)一個(gè)臨時(shí)對(duì)象鲤遥,在允許級(jí)聯(lián)保存的情況下,Session在清理緩存時(shí)會(huì)把這個(gè)臨時(shí)對(duì)象也轉(zhuǎn)變?yōu)槌志没瘜?duì)象林艘。
被刪除對(duì)象的特征:
1.OID不為null盖奈。
2.從一個(gè)Session實(shí)例的緩存中刪除。
3.被刪除對(duì)象和數(shù)據(jù)庫中的相關(guān)記錄對(duì)應(yīng)狐援。
4.Session已經(jīng)計(jì)劃將其從數(shù)據(jù)庫中刪除钢坦。
5.Session在清理緩存時(shí),會(huì)執(zhí)行SQL delete語句啥酱,刪除數(shù)據(jù)庫中的相應(yīng)記錄爹凹。
6.一般情況下,應(yīng)用程序不應(yīng)該再使用被刪除的對(duì)象镶殷。
在以下情況下禾酱,Java對(duì)象會(huì)進(jìn)入刪除狀態(tài):
1.在Hibernate的配置文件中的hibernate.use_identifier_rollback屬性去默認(rèn)值false的情況下,Session的delete()方法把持久化對(duì)象及游離對(duì)象轉(zhuǎn)變?yōu)楸粍h除對(duì)象绘趋。
2.當(dāng)一個(gè)持久化對(duì)象A關(guān)聯(lián)一個(gè)持久化對(duì)象颤陶,在允許級(jí)聯(lián)刪除的情況下,Session刪除持久化對(duì)象A時(shí)埋心,會(huì)級(jí)聯(lián)刪除持久化對(duì)象B指郁,使得持久化對(duì)象A和持久化對(duì)象B都進(jìn)入刪除狀態(tài)。
游離對(duì)象的特征:
1.OID不為null拷呆。
2.不再位于Session的緩存中闲坎,也可以說,游離對(duì)象不被Session關(guān)聯(lián)茬斧。
3.游離對(duì)象是由持久化對(duì)象轉(zhuǎn)變過來的腰懂,因此在數(shù)據(jù)庫中可能還存在與它對(duì)應(yīng)的記錄。
Session的以下方法使持久化對(duì)象轉(zhuǎn)變?yōu)橛坞x對(duì)象项秉。
1.當(dāng)調(diào)用Session的close()方法時(shí)绣溜,Session的緩存被清空,緩存中的所有持久化對(duì)象都變?yōu)橛坞x對(duì)象娄蔼。如果在應(yīng)用程序中沒有引用變量引用這些游離對(duì)象怖喻,它們就會(huì)結(jié)束生命周期底哗。
2.Session的evict()方法能夠從緩存中清除一個(gè)持久化對(duì)象,使它變?yōu)橛坞x對(duì)象锚沸。當(dāng)Session的緩存中保存了大量的持久化對(duì)象跋选,會(huì)消耗許多內(nèi)存空間,為了提高性能哗蜈,可以考慮調(diào)用evict()方法前标,從緩存中清楚一些持久化對(duì)象。但是在多數(shù)情況下不推薦使用evict()方法距潘,而應(yīng)該通過查詢語言或者顯示的導(dǎo)航來控制對(duì)象圖的深度炼列。
3.Session的clear()方法能夠清除緩存中的所有持久化對(duì)象,使他們變?yōu)橛坞x對(duì)象音比。