Hibernate 对象的三种状态
Hibernate 對象的三種狀態(tài)
瞬時(transient):
由new操作符創(chuàng)建,且尚未與Hibernate Session關(guān)聯(lián)的對象被認(rèn)定為瞬時(Transient)的。瞬時(Transient)對象不會被持久化到數(shù)據(jù)庫中,也不會被賦予持久化標(biāo)識(identifier)。如果瞬時(Transient)對象在程序中沒有被引用,它會被垃圾回收器(garbage collector)銷毀。使用Hibernate Session可以將其變?yōu)槌志?#xff08;Persistent)狀態(tài)。(Hibernate會自動執(zhí)行必要的SQL語句)。
瞬時狀態(tài)的特點有:
1、 與數(shù)據(jù)庫中的記錄沒有任何關(guān)聯(lián),也就是沒有與其相關(guān)聯(lián)的數(shù)據(jù)庫記錄。
2、 與Session沒有任何關(guān)系,也就是沒有通過Session對象的實例對其進(jìn)行任何持久化的操作。
舉例:
User user=new User(); //user是一個瞬時對象,在數(shù)據(jù)庫的表中是沒有記錄和該對象相對應(yīng)的。和session沒有關(guān)系。
user.setName(“ddd”);
user.setBirthday(new Date());
session.save(user); //持久化狀態(tài)
持久(persistent):
數(shù)據(jù)庫中有數(shù)據(jù)與之對應(yīng),當(dāng)前與session有關(guān)聯(lián),并且相關(guān)聯(lián)的session沒有關(guān)閉,事務(wù)沒有提交;持久對象狀態(tài)發(fā)生改變,在事務(wù)提交時會影響到數(shù)據(jù)(Hibernate能檢測到)。
持久(Persistent)是實例在數(shù)據(jù)庫中有對應(yīng)的記錄,并擁有一個持久化標(biāo)識(identifier)。持久(Persistent)的實例可能是剛被保存的,或剛被加載的,無論哪一種,按定義,它存在于相關(guān)聯(lián)的Session作用范圍內(nèi)。Hibernate會檢測到處于持久(Persistent)狀態(tài)的對象的任何改動,在當(dāng)前操作單元(unit of work)執(zhí)行完畢時將對象數(shù)據(jù)(state)與數(shù)據(jù)庫同步(synchronize)。開發(fā)者不需要手動執(zhí)行Update。將對象從持久(Persistent)狀態(tài)編程瞬時(Transient)狀態(tài)同樣也不需要手動執(zhí)行delete語句。
持久對象具有如下特點:
1、 和session實例關(guān)聯(lián);
2、 在數(shù)據(jù)庫中有與之關(guān)聯(lián)的記錄。
3、 Hibernate會根據(jù)持久態(tài)對象的屬性的變化而改變數(shù)據(jù)庫中的相應(yīng)記錄。
舉例:
Session session = factory.openSession();Transaction tx = session.beginTransaction();session.save(stu); // persistent持久化狀態(tài)System.out.println(stu);tx.commit();session.close(); //執(zhí)行close()方法之后,就會由持久對象轉(zhuǎn)換成脫管對象System.out.println(stu); // 脫管對象
脫管/游離(detached):數(shù)據(jù)庫中有數(shù)據(jù)與之對應(yīng),但沒有session與之關(guān)聯(lián),脫管對象狀態(tài)發(fā)生改變,hibernate不能檢測到。
脫管狀態(tài):
與持久(Persistent)狀態(tài)對象關(guān)聯(lián)的Session被關(guān)閉后,對象就變?yōu)槊摴?#xff08;Detached)的。對脫管(Detached)對象的引用依然有效,對象可繼續(xù)被修改。脫管(Detached)對象如果重新關(guān)聯(lián)到某個新的Session上,會再次轉(zhuǎn)變?yōu)槌志?#xff08;Transistent)的(在脫管Detached其間的改動將被持久化到數(shù)據(jù)庫)。這個功能使得一種編程模型,即中間會給用戶思考時間(user think-time)的長時間運(yùn)行的操作單元(unit of work).
脫管對象擁有數(shù)據(jù)庫的識別值,可通過update()、saveOrUpdate()等方法,轉(zhuǎn)變成持久對象。
脫管對象具有如下特點:
1、 本質(zhì)上與瞬時對象相同,在沒有任何變量引用它時,JVM會在適當(dāng)?shù)臅r候?qū)⑺厥?#xff1b;
2、 比瞬時對象多了一個數(shù)據(jù)庫記錄標(biāo)識值。
3、 不在于Session相關(guān)聯(lián)。
4、 脫管對象一定是由持久態(tài)對象轉(zhuǎn)化而來。
首先是我們的UML圖轉(zhuǎn)換:以及解析:
對以上圖形的解析:
1、當(dāng)一個對象被new了以后此對象處于瞬時態(tài)(Transient);
2、然后對此對象執(zhí)行session的save() 或者saveOrUpdate()方法后,此對象被放入session的一級緩存進(jìn)入持久態(tài).
2、當(dāng)再對此對象執(zhí)行evict()/close()/clear()的操作后此對象進(jìn)入游離態(tài)(Detached)
4、游離態(tài)(Detached)和瞬時態(tài)(Transient)的對象由于沒有被session管理會在適當(dāng)?shù)臅r機(jī)被java的垃圾回收站(garbage)回收.
5、執(zhí)行session的get()/load()/find()/iternte()等方法從數(shù)據(jù)庫里查詢的到的對象,處于持久態(tài)(Persistent).
6、當(dāng)對數(shù)據(jù)庫中的紀(jì)錄進(jìn)行update()/saveOrUpdate()/lock()操作后游離態(tài)的對象就過渡到持久態(tài)
7、處于持久態(tài)(Persistent)與游離態(tài)(Detached)的對象在數(shù)據(jù)庫中都有對應(yīng)的記錄.
8、瞬時態(tài)(Transient)與游離態(tài)(Detached)的對象都可以被回收可是瞬時態(tài)的對象在數(shù)據(jù)庫中沒有對應(yīng)的紀(jì)錄,而游離態(tài)的對象在數(shù)據(jù)庫中有對用的紀(jì)錄。
1、操縱持久化對象-save()
(1)Session 的 save() 方法使一個臨時對象轉(zhuǎn)變?yōu)槌志没瘜ο?/p>
(2)Session 的 save() 方法完成以下操作:
(3)把 News 對象加入到 Session 緩存中, 使它進(jìn)入持久化狀態(tài)
(4)選用映射文件指定的標(biāo)識符生成器, 為持久化對象分配唯一的 OID. 在使用代理主鍵的情況下, setId() 方法為 News 對象設(shè)置 OID 使無效的.
(5)計劃執(zhí)行一條 insert 語句,把Customer對象當(dāng)前的屬性值組裝到insert語句中
(6)Hibernate 通過持久化對象的 OID 來維持它和數(shù)據(jù)庫相關(guān)記錄的對應(yīng)關(guān)系. 當(dāng) News 對象處于持久化狀態(tài)時, 不允許程序隨意修改它的 ID
2、 操縱持久化對象-update()
(1)Session 的 update() 方法使一個游離對象轉(zhuǎn)變?yōu)槌志没瘜ο? 并且計劃執(zhí)行一條 update 語句.
3、操縱持久化對象-saveOrupdate()
saveOrUpdate:
該方法同時包含save和update方法,如果參數(shù)是臨時對象就用save方
法,如果是游離對象就用update方法,如果是持久化對象就直接返回。
如果參數(shù)是臨時對象就用save方法
如果是游離對象就用update方法
如果是持久化對象就直接返回,不執(zhí)行操作
總結(jié)
以上是生活随笔為你收集整理的Hibernate 对象的三种状态的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Nginx配置相关结构划分的技巧和禁止I
- 下一篇: Hibernate懒加载