hibernate的狀態(tài)
hibernate的各種保存方式的區(qū)(save,persist,update,saveOrUpdte,merge,flush,lock)及 對(duì)象的三種狀態(tài)
hibernate的保存
hibernate對(duì)于對(duì)象的保存提供了太多的方法,他們之間有很多不同,這里細(xì)說(shuō)一下,以便區(qū)別。
一、預(yù)備知識(shí)
在所有之前,說(shuō)明一下,對(duì)于hibernate,它的對(duì)象有三種狀態(tài),transient、persistent、detached
下邊是常見的翻譯辦法:
transient:瞬態(tài)或者自由態(tài)
persistent:持久化狀態(tài)
detached:脫管狀態(tài)或者游離態(tài)
因關(guān)閉session而變成游離態(tài)的可以通過(guò)lock、save、update變成持久態(tài)
持久態(tài)實(shí)例可以通過(guò)調(diào)用 delete()變成脫管狀態(tài)。
而update()或merge()會(huì)引發(fā)SQL UPDATE。對(duì)持久化(persistent)實(shí)例的修改在刷新提交的時(shí)候會(huì)被檢測(cè)到,它也會(huì)引起SQL UPDATE。
二、save 和update區(qū)別
三、update 和saveOrUpdate區(qū)別
通常下面的場(chǎng)景會(huì)使用update()或saveOrUpdate():
saveOrUpdate(po)做下面的事:
org.hibernate.NonUniqueObjectException
四、persist和save區(qū)別
這里給出一個(gè)明確的區(qū)分。(可以跟進(jìn)src看一下,雖然實(shí)現(xiàn)步驟類似,但是還是有細(xì)微的差別)
主要內(nèi)容區(qū)別:
1,persist把一個(gè)瞬態(tài)的實(shí)例持久化,但是并"不保證"標(biāo)識(shí)符(identifier主鍵對(duì)應(yīng)的屬性)被立刻填入到持久化實(shí)例中,標(biāo)識(shí)符的填入可能被推遲到flush的時(shí)候。
2,save, 把一個(gè)瞬態(tài)的實(shí)例持久化標(biāo)識(shí)符,及時(shí)的產(chǎn)生,它要返回標(biāo)識(shí)符,所以它會(huì)立即執(zhí)行Sql insert
五、saveOrUpdate,merge和update區(qū)別
比較update和merge
(1)當(dāng)我們使用update的時(shí)候,執(zhí)行完成后,會(huì)拋出異常
(2)但當(dāng)我們使用merge的時(shí)候,把處理自由態(tài)的po對(duì)象A的屬性copy到session當(dāng)中處于持久態(tài)的po的屬性中,執(zhí)行完成后原來(lái)是持久狀態(tài)還是持久態(tài),而我們提供的A還是自由態(tài)
六、flush和update區(qū)別
1, 調(diào)用某些查詢的和手動(dòng)flush(),session的關(guān)閉、SessionFactory關(guān)閉結(jié)合
get()一個(gè)對(duì)象,把對(duì)象的屬性進(jìn)行改變,把資源關(guān)閉。
2,transaction commit的時(shí)候(包含了flush)
七、lock和update區(qū)別
對(duì)應(yīng)更改一個(gè)記錄的內(nèi)容,兩個(gè)的操作不同:
update的操作步驟是:
(1)屬性改動(dòng)后的脫管的對(duì)象的修改->調(diào)用update
lock的操作步驟是:
(2)調(diào)用lock把未修改的對(duì)象從脫管狀態(tài)變成持久狀態(tài)-->更改持久狀態(tài)的對(duì)象的內(nèi)容-->等待flush或者手動(dòng)flush
八、clear和evcit的區(qū)別
clear完整的清除session緩存
session.lock(xtyhb,LockMode.NONE);//表示直接到緩存中去找變成持久態(tài)的對(duì)象
session.lock(xtyhb,LockMode.READ);//先通過(guò)ID讀數(shù)據(jù)庫(kù)該記錄的ID看是否有該記錄,如果有接著到緩存中去找變成持久態(tài)的對(duì)象
本文轉(zhuǎn)自:http://hi.baidu.com/anypcao/blog/item/fd8943e7f4930324b93820d6