最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Hibernate的各種保存方式的區(qū)別詳解

 更新時(shí)間:2019年03月29日 16:32:01   作者:徐劉根  
今天小編就為大家分享一篇關(guān)于Hibernate的各種保存方式的區(qū)別詳解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧

hibernate的保存 

hibernate對(duì)于對(duì)象的保存提供了太多的方法,他們之間有很多不同,這里細(xì)說(shuō)一下,以便區(qū)別: 

一、預(yù)備知識(shí): 

在所有之前,說(shuō)明一下,對(duì)于hibernate,它的對(duì)象有三種狀態(tài),transient、persistent、detached 

下邊是常見(jiàn)的翻譯辦法: 

  • transient:瞬態(tài)或者自由態(tài) 
  • persistent:持久化狀態(tài) 
  • detached:脫管狀態(tài)或者游離態(tài) 

脫管狀態(tài)的實(shí)例可以通過(guò)調(diào)用save()、persist()或者saveOrUpdate()方法進(jìn)行持久化。 

持久化實(shí)例可以通過(guò)調(diào)用 delete()變成脫管狀態(tài)。通過(guò)get()或load()方法得到的實(shí)例都是持久化狀態(tài)的。 

脫管狀態(tài)的實(shí)例可以通過(guò)調(diào)用 update()、saveOrUpdate()、lock()或者replicate()進(jìn)行持久化。 

游離或者自由狀態(tài)下的實(shí)例可以通過(guò)調(diào)用merge()方法成為一個(gè)新的持久化實(shí)例。 

save()和persist()將會(huì)引發(fā)SQL的INSERT,delete()會(huì)引發(fā)SQL的DELETE, 

而update()或merge()會(huì)引發(fā)SQL的UPDATE。

對(duì)持久化(persistent)實(shí)例的修改在刷新提交的時(shí)候會(huì)被檢測(cè)到,它也會(huì)引起SQLUPDATE。saveOrUpdate()或者replicate()會(huì)引發(fā)SQLINSERT或者UPDATE 

二、save 和update區(qū)別 

把這一對(duì)放在第一位的原因是因?yàn)檫@一對(duì)是最常用的。 

save的作用是把一個(gè)新的對(duì)象保存 

update是把一個(gè)脫管狀態(tài)的對(duì)象保存 

三,update 和saveOrUpdate區(qū)別 

這個(gè)是比較好理解的,顧名思義,saveOrUpdate基本上就是合成了save和update 

引用hibernate reference中的一段話來(lái)解釋他們的使用場(chǎng)合和區(qū)別 

通常下面的場(chǎng)景會(huì)使用update()或saveOrUpdate(): 

程序在第一個(gè)session中加載對(duì)象 

該對(duì)象被傳遞到表現(xiàn)層 

對(duì)象發(fā)生了一些改動(dòng) 

該對(duì)象被返回到業(yè)務(wù)邏輯層 

程序調(diào)用第二個(gè)session的update()方法持久這些改動(dòng) 

saveOrUpdate()做下面的事: 

  • 如果對(duì)象已經(jīng)在本session中持久化了,不做任何事 
  • 如果另一個(gè)與本session關(guān)聯(lián)的對(duì)象擁有相同的持久化標(biāo)識(shí)(identifier),拋出一個(gè)異常 
  • 如果對(duì)象沒(méi)有持久化標(biāo)識(shí)(identifier)屬性,對(duì)其調(diào)用save() 
  • 如果對(duì)象的持久標(biāo)識(shí)(identifier)表明其是一個(gè)新實(shí)例化的對(duì)象,對(duì)其調(diào)用save() 
  • 如果對(duì)象是附帶版本信息的(通過(guò)<version>或<timestamp>) 并且版本屬性的值表明其是一個(gè)新實(shí)例化的對(duì)象,save()它。 
  • 否則update() 這個(gè)對(duì)象 

四,persist和save區(qū)別 

這個(gè)是最迷離的一對(duì),表面上看起來(lái)使用哪個(gè)都行,在hibernate reference文檔中也沒(méi)有明確的區(qū)分他們. 

這里給出一個(gè)明確的區(qū)分。(可以跟進(jìn)src看一下,雖然實(shí)現(xiàn)步驟類似,但是還是有細(xì)微的差別) 

這里參考http://opensource.atlassian.com/projects/hibernate/browse/HHH-1682中的一個(gè)說(shuō)明: 

---------------------------------------------------------------------------------
I found that a lot of people have the same doubt. To help to solve this issue
I'm quoting Christian Bauer:
"In case anybody finds this thread...
persist() is well defined. It makes a transient instance persistent. However,
it doesn't guarantee that the identifier value will be assigned to the persistent
instance immediately, the assignment might happen at flush time. The spec doesn't say
that, which is the problem I have with persist().
persist() also guarantees that it will not execute an INSERT statement if it is
called outside of transaction boundaries. This is useful in long-running conversations
with an extended Session/persistence context.A method like persist() is required.
save() does not guarantee the same, it returns an identifier, and if an INSERT
has to be executed to get the identifier (e.g. "identity" generator, not "sequence"),
this INSERT happens immediately, no matter if you are inside or outside of a transaction. This is not good in a long-running conversation with an extended Session/persistence context."
---------------------------------------------------------------------------------

簡(jiǎn)單翻譯一下上邊的句子的主要內(nèi)容: 

1,persist把一個(gè)瞬態(tài)的實(shí)例持久化,但是并"不保證"標(biāo)識(shí)符被立刻填入到持久化實(shí)例中,標(biāo)識(shí)符的填入可能被推遲到flush的時(shí)間。 

2,persist"保證",當(dāng)它在一個(gè)transaction外部被調(diào)用的時(shí)候并不觸發(fā)一個(gè)Sql Insert,這個(gè)功能是很有用的,當(dāng)我們通過(guò)繼承Session/persistence context來(lái)封裝一個(gè)長(zhǎng)會(huì)話流程的時(shí)候,一個(gè)persist這樣的函數(shù)是需要的。 

3,save"不保證"第2條,它要返回標(biāo)識(shí)符,所以它會(huì)立即執(zhí)行Sql insert,不管是不是在transaction內(nèi)部還是外部 

五,saveOrUpdateCopy,merge和update區(qū)別 

首先說(shuō)明merge是用來(lái)代替saveOrUpdateCopy的

然后比較update和merge 

update的作用上邊說(shuō)了,這里說(shuō)一下merge的 

如果session中存在相同持久化標(biāo)識(shí)(identifier)的實(shí)例,用用戶給出的對(duì)象的狀態(tài)覆蓋舊有的持久實(shí)例 

如果session沒(méi)有相應(yīng)的持久實(shí)例,則嘗試從數(shù)據(jù)庫(kù)中加載,或創(chuàng)建新的持久化實(shí)例,最后返回該持久實(shí)例 

用戶給出的這個(gè)對(duì)象沒(méi)有被關(guān)聯(lián)到session上,它依舊是脫管的 

重點(diǎn)是最后一句: 

當(dāng)我們使用update的時(shí)候,執(zhí)行完成后,我們提供的對(duì)象A的狀態(tài)變成持久化狀態(tài)但當(dāng)我們使用merge的時(shí)候,執(zhí)行完成,我們提供的對(duì)象A還是脫管狀態(tài),hibernate或者new了一個(gè)B,或者檢索到一個(gè)持久對(duì)象B,并把我們提供的對(duì)象A的所有的值拷貝到這個(gè)B,執(zhí)行完成后B是持久狀態(tài),而我們提供的A還是托管狀態(tài) 

六,flush和update區(qū)別 

這兩個(gè)的區(qū)別好理解 

update操作的是在脫管狀態(tài)的對(duì)象 

而flush是操作的在持久狀態(tài)的對(duì)象。 

默認(rèn)情況下,一個(gè)持久狀態(tài)的對(duì)象是不需要update的,只要你更改了對(duì)象的值,等待hibernate flush就自動(dòng)保存到數(shù)據(jù)庫(kù)了。hibernate flush發(fā)生再幾種情況下: 

  • 1,調(diào)用某些查詢的時(shí)候 
  • 2,transaction commit的時(shí)候 
  • 3,手動(dòng)調(diào)用flush的時(shí)候 

七,lock和update區(qū)別 

update是把一個(gè)已經(jīng)更改過(guò)的脫管狀態(tài)的對(duì)象變成持久狀態(tài) 

lock是把一個(gè)沒(méi)有更改過(guò)的脫管狀態(tài)的對(duì)象變成持久狀態(tài) 

對(duì)應(yīng)更改一個(gè)記錄的內(nèi)容,兩個(gè)的操作不同: 

update的操作步驟是: 

(1)更改脫管的對(duì)象->調(diào)用update 

lock的操作步驟是: 

(2)調(diào)用lock把對(duì)象從脫管狀態(tài)變成持久狀態(tài)-->更改持久狀態(tài)的對(duì)象的內(nèi)容-->等待flush或者手動(dòng)flush

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接

相關(guān)文章

  • java“與”符號(hào)寫法與用法

    java“與”符號(hào)寫法與用法

    在本篇文章里小編給大家整理的是關(guān)于java“與”符號(hào)寫法與用法,對(duì)此有需要的朋友們可以學(xué)習(xí)下。
    2020-02-02
  • Java打包Jar包后使用腳本執(zhí)行

    Java打包Jar包后使用腳本執(zhí)行

    本文詳細(xì)講解了Java打包Jar包后使用腳本執(zhí)行的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • Java8新特性之StampedLock_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java8新特性之StampedLock_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    本文從synchronized、Lock到Java8新增的StampedLock進(jìn)行對(duì)比分析,對(duì)Java8新特性之StampedLock相關(guān)知識(shí)感興趣的朋友一起看看吧
    2017-06-06
  • 一文徹底了解Java的組合模式

    一文徹底了解Java的組合模式

    組合模式(Composite?Pattern)指將對(duì)象組合成樹(shù)形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu),?使得用戶對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性。本文就來(lái)帶大家深入了解一下Java的組合模式吧
    2023-02-02
  • 詳解hashCode()和equals()的本質(zhì)區(qū)別和聯(lián)系

    詳解hashCode()和equals()的本質(zhì)區(qū)別和聯(lián)系

    這篇文章主要介紹了詳解hashCode()和equals()的本質(zhì)區(qū)別和聯(lián)系,本文先對(duì)兩種方法作了介紹,然后對(duì)二者聯(lián)系進(jìn)行分析,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-09-09
  • Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)項(xiàng)目之寵物商城系統(tǒng)的實(shí)現(xiàn)流程

    Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)項(xiàng)目之寵物商城系統(tǒng)的實(shí)現(xiàn)流程

    這是一個(gè)使用了java+Springboot+Maven+mybatis+Vue+mysql開(kāi)發(fā)的寵物商城系統(tǒng),是一個(gè)畢業(yè)設(shè)計(jì)的實(shí)戰(zhàn)練習(xí),具有寵物商城該有的所有功能,感興趣的朋友快來(lái)看看吧
    2022-01-01
  • SpringBoot讀寫xml上傳到AWS存儲(chǔ)服務(wù)S3的示例

    SpringBoot讀寫xml上傳到AWS存儲(chǔ)服務(wù)S3的示例

    這篇文章主要介紹了SpringBoot讀寫xml上傳到S3的示例,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下
    2020-10-10
  • Spring MVC攔截器的基本使用方法

    Spring MVC攔截器的基本使用方法

    這篇文章主要給大家介紹了關(guān)于Spring MVC攔截器的基本使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring MVC具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • java實(shí)現(xiàn)批量生成二維碼

    java實(shí)現(xiàn)批量生成二維碼

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)批量生成二維碼的相關(guān)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • 使用IDEA打jar包的詳細(xì)圖文教程

    使用IDEA打jar包的詳細(xì)圖文教程

    JAR文件是一種壓縮文件,與常見(jiàn)的ZIP壓縮文件兼容,被稱為JAR包,下面這篇文章主要給大家介紹了關(guān)于使用IDEA打jar包的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08

最新評(píng)論

吉林市| 方正县| 宁城县| 沽源县| 兴业县| 来宾市| 滦南县| 岗巴县| 历史| 丰顺县| 新野县| 巴林左旗| 洪泽县| 松溪县| 桐梓县| 富民县| 大同县| 宽甸| 修水县| 滨州市| 新源县| 六枝特区| 通州区| 陆良县| 达拉特旗| 南川市| 寿光市| 泊头市| 红桥区| 越西县| 大邑县| 钟山县| 柯坪县| 灯塔市| 买车| 宣威市| 鹿邑县| 米林县| 常熟市| 永登县| 祁连县|