<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    DANCE WITH JAVA

    開發(fā)出高質(zhì)量的系統(tǒng)

    常用鏈接

    統(tǒng)計(jì)

    積分與排名

    好友之家

    最新評(píng)論

    hibernate的各種保存方式的區(qū)別 (save,persist,update,saveOrUpdte,merge,flush,lock)等

    hibernate的保存
    hibernate對(duì)于對(duì)象的保存提供了太多的方法,他們之間有很多不同,這里細(xì)說一下,以便區(qū)別:
    一、預(yù)備知識(shí):
    在所有之前,說明一下,對(duì)于hibernate,它的對(duì)象有三種狀態(tài),transient、persistent、detached
    下邊是常見的翻譯辦法:
    transient:瞬態(tài)或者自由態(tài)
    persistent:持久化狀態(tài)
    detached:脫管狀態(tài)或者游離態(tài)

    游離狀態(tài)的實(shí)例可以通過調(diào)用save()、persist()或者saveOrUpdate()方法進(jìn)行持久化。
    持久化實(shí)例可以通過調(diào)用 delete()變成脫管狀態(tài)。通過get()或load()方法得到的實(shí)例都是持久化狀態(tài)的。
    脫管狀態(tài)的實(shí)例可以通過調(diào)用 update()、0saveOrUpdate()、lock()或者replicate()進(jìn)行持久化。

    save()和persist()將會(huì)引發(fā)SQL的INSERT,delete()會(huì)引發(fā)SQLDELETE,
    而update()或merge()會(huì)引發(fā)SQLUPDATE。對(duì)持久化(persistent)實(shí)例的修改在刷新提交的時(shí)候會(huì)被檢測到,
    它也會(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中的一段話來解釋他們的使用場合和區(qū)別
    通常下面的場景會(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ì)象沒有持久化標(biāo)識(shí)(identifier)屬性,對(duì)其調(diào)用save()
    如果對(duì)象的持久標(biāo)識(shí)(identifier)表明其是一個(gè)新實(shí)例化的對(duì)象,對(duì)其調(diào)用save()
    如果對(duì)象是附帶版本信息的(通過<version>或<timestamp>) 并且版本屬性的值表明其是一個(gè)新實(shí)例化的對(duì)象,save()它。
    否則update() 這個(gè)對(duì)象

    四,persist和save區(qū)別
    這個(gè)是最迷離的一對(duì),表面上看起來使用哪個(gè)都行,在hibernate reference文檔中也沒有明確的區(qū)分他們.
    這里給出一個(gè)明確的區(qū)分。(可以跟進(jìn)src看一下,雖然實(shí)現(xiàn)步驟類似,但是還是有細(xì)微的差別)
    這里參考http://opensource.atlassian.com/projects/hibernate/browse/HHH-1682中的一個(gè)說明:
    ---------------------------------------------------------------------------------
    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."

    ---------------------------------------------------------------------------------
    簡單翻譯一下上邊的句子的主要內(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)我們通過繼承Session/persistence context來封裝一個(gè)長會(huì)話流程的時(shí)候,一個(gè)persist這樣的函數(shù)是需要的。

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


    五,saveOrUpdateCopy,merge和update區(qū)別
    首先說明merge是用來代替saveOrUpdateCopy的,這個(gè)詳細(xì)見這里
    http://www.tkk7.com/dreamstone/archive/2007/07/28/133053.html
    然后比較update和merge
    update的作用上邊說了,這里說一下merge的
    如果session中存在相同持久化標(biāo)識(shí)(identifier)的實(shí)例,用用戶給出的對(duì)象的狀態(tài)覆蓋舊有的持久實(shí)例
    如果session沒有相應(yīng)的持久實(shí)例,則嘗試從數(shù)據(jù)庫中加載,或創(chuàng)建新的持久化實(shí)例,最后返回該持久實(shí)例
    用戶給出的這個(gè)對(duì)象沒有被關(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ù)庫了。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)更改過的脫管狀態(tài)的對(duì)象變成持久狀態(tài)
    lock是把一個(gè)沒有更改過的脫管狀態(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

    參考內(nèi)容:
    http://www.tkk7.com/iamtin/archive/2006/03/06/33910.aspx
    http://opensource.atlassian.com/projects/hibernate/browse/HHH-1682
    http://www.redsaga.com/hibernate-ref/3.x/zh-cn/html/objectstate.html

    posted on 2007-07-29 00:19 dreamstone 閱讀(59502) 評(píng)論(13)  編輯  收藏 所屬分類: dao層框架

    評(píng)論

    # re: hibernate的各種保存方式的區(qū)別 (save,persist,update,saveOrUpdte,merge,flush,lock)等 2007-11-19 08:32 sitinspring

    總結(jié)得不錯(cuò).  回復(fù)  更多評(píng)論   

    # 內(nèi)容有一點(diǎn)點(diǎn)錯(cuò)誤 2008-09-03 23:02 Andycpp

    在你文章的開頭部分,有這樣一句話:“持久化實(shí)例可以通過調(diào)用 delete()變成脫管狀態(tài)。”

    但是Hibernate手冊(cè)在10.8小節(jié)是這樣寫的:
    It's best to think of delete() as making a persistent instance transient.   回復(fù)  更多評(píng)論   

    # re: hibernate的各種保存方式的區(qū)別 (save,persist,update,saveOrUpdte,merge,flush,lock)等 2008-12-13 00:33 Jessica Chen

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

      回復(fù)  更多評(píng)論   

    # re: hibernate的各種保存方式的區(qū)別 (save,persist,update,saveOrUpdte,merge,flush,lock)等 2009-06-04 21:52 發(fā)發(fā)

    牛B大了  回復(fù)  更多評(píng)論   

    # re: hibernate的各種保存方式的區(qū)別 (save,persist,update,saveOrUpdte,merge,flush,lock)等[未登錄] 2010-01-27 21:59 活在陽光下

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

    這句是不是有誤,"脫管狀態(tài)"應(yīng)該為"瞬時(shí)狀態(tài)"?  回復(fù)  更多評(píng)論   

    # re: hibernate的各種保存方式的區(qū)別 (save,persist,update,saveOrUpdte,merge,flush,lock)等 2010-07-07 16:41 淘寶網(wǎng)

    下邊是常見的翻譯辦法:
    transient:瞬態(tài)或者自由態(tài)
    persistent:持久化狀態(tài)  回復(fù)  更多評(píng)論   

    # re: hibernate的各種保存方式的區(qū)別 (save,persist,update,saveOrUpdte,merge,flush,lock)等[未登錄] 2010-09-16 12:38

    受教了  回復(fù)  更多評(píng)論   

    # re: hibernate的各種保存方式的區(qū)別 (save,persist,update,saveOrUpdte,merge,flush,lock)等[未登錄] 2011-12-05 04:50 ssh

    寫的不錯(cuò),通俗易懂  回復(fù)  更多評(píng)論   

    # re: hibernate的各種保存方式的區(qū)別 (save,persist,update,saveOrUpdte,merge,flush,lock)等 2012-03-07 15:11 re

    總結(jié)的好,雖然有些小問題,很不錯(cuò)  回復(fù)  更多評(píng)論   

    # re: hibernate的各種保存方式的區(qū)別 (save,persist,update,saveOrUpdte,merge,flush,lock)等 2012-04-26 16:03 謙虛的波波

    @Andycpp哥們你要是查查翻譯就好了,它就是說delete()方法是把持久化態(tài)變成瞬態(tài)啊!!!!
      回復(fù)  更多評(píng)論   

    # re: hibernate的各種保存方式的區(qū)別 (save,persist,update,saveOrUpdte,merge,flush,lock)等[未登錄] 2013-05-02 10:55 me

    內(nèi)容有些寫錯(cuò)了  回復(fù)  更多評(píng)論   

    # re: hibernate的各種保存方式的區(qū)別 (save,persist,update,saveOrUpdte,merge,flush,lock)等[未登錄] 2013-09-12 11:22 趙飛

    挺模糊,不過挺有用的  回復(fù)  更多評(píng)論   

    # re: hibernate的各種保存方式的區(qū)別 (save,persist,update,saveOrUpdte,merge,flush,lock)等 2015-08-18 10:33 阿斯頓

    hibernate的保存
    hibernate對(duì)于對(duì)象的保存提供了太多的方法,他們之間有很多不同,這里細(xì)說一下,以便區(qū)別:
    一、預(yù)備知識(shí):
    在所有之前,說明一下,對(duì)于hibernate,它的對(duì)象有三種狀態(tài),transient、persistent、detached
    下邊是常見的翻譯辦法:
    transient:瞬態(tài)或者自由態(tài)
    persistent:持久化狀態(tài)
    detached:脫管狀態(tài)或者游離態(tài)

    游離狀態(tài)的實(shí)例可以通過調(diào)用save()、persist()或者saveOrUpdate()方法進(jìn)行持久化。
    持久化實(shí)例可以通過調(diào)用 delete()變成脫管狀態(tài)。通過get()或load()方法得到的實(shí)例都是持久化狀態(tài)的。
    脫管狀態(tài)的實(shí)例可以通過調(diào)用 update()、0saveOrUpdate()、lock()或者replicate()進(jìn)行持久化。

    save()和persist()將會(huì)引發(fā)SQL的INSERT,delete()會(huì)引發(fā)SQLDELETE,
    而update()或merge()會(huì)引發(fā)SQLUPDATE。對(duì)持久化(persistent)實(shí)例的修改在刷新提交的時(shí)候會(huì)被檢測到,
    它也會(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中的一段話來解釋他們的使用場合和區(qū)別
    通常下面的場景會(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ì)象沒有持久化標(biāo)識(shí)(identifier)屬性,對(duì)其調(diào)用save()
    如果對(duì)象的持久標(biāo)識(shí)(identifier)表明其是一個(gè)新實(shí)例化的對(duì)象,對(duì)其調(diào)用save()
    如果對(duì)象是附帶版本信息的(通過<version>或<timestamp>) 并且版本屬性的值表明其是一個(gè)新實(shí)例化的對(duì)象,save()它。
    否則update() 這個(gè)對(duì)象

    四,persist和save區(qū)別
    這個(gè)是最迷離的一對(duì),表面上看起來使用哪個(gè)都行,在hibernate reference文檔中也沒有明確的區(qū)分他們.
    這里給出一個(gè)明確的區(qū)分。(可以跟進(jìn)src看一下,雖然實(shí)現(xiàn)步驟類似,但是還是有細(xì)微的差別)
    這里參考http://opensource.atlassian.com/projects/hibernate/browse/HHH-1682中的一個(gè)說明" target="_new" rel="nofollow">http://opensource.atlassian.com/projects/hibernate/browse/HHH-1682中的一個(gè)說明:
    ---------------------------------------------------------------------------------
    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."

    ---------------------------------------------------------------------------------
    簡單翻譯一下上邊的句子的主要內(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)我們通過繼承Session/persistence context來封裝一個(gè)長會(huì)話流程的時(shí)候,一個(gè)persist這樣的函數(shù)是需要的。

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


    五,saveOrUpdateCopy,merge和update區(qū)別
    首先說明merge是用來代替saveOrUpdateCopy的,這個(gè)詳細(xì)見這里
    http://www.tkk7.com/dreamstone/archive/2007/07/28/133053.html
    然后比較update和merge
    update的作用上邊說了,這里說一下merge的
    如果session中存在相同持久化標(biāo)識(shí)(identifier)的實(shí)例,用用戶給出的對(duì)象的狀態(tài)覆蓋舊有的持久實(shí)例
    如果session沒有相應(yīng)的持久實(shí)例,則嘗試從數(shù)據(jù)庫中加載,或創(chuàng)建新的持久化實(shí)例,最后返回該持久實(shí)例
    用戶給出的這個(gè)對(duì)象沒有被關(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ù)庫了。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)更改過的脫管狀態(tài)的對(duì)象變成持久狀態(tài)
    lock是把一個(gè)沒有更改過的脫管狀態(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

    參考內(nèi)容:
    http://www.tkk7.com/iamtin/archive/2006/03/06/33910.aspx
    http://opensource.atlassian.com/projects/hibernate/browse/HHH-1682
    http://www.redsaga.com/hibernate-ref/3.x/zh-cn/html/objectstate.html

    posted on 2007-07-29 00:19 dreamstone 閱讀(46501) 評(píng)論(12) 編輯 收藏 所屬分類: dao層框架  回復(fù)  更多評(píng)論   

    主站蜘蛛池模板: 国产三级免费电影| 日本免费久久久久久久网站| 免费人成在线视频| 亚洲大香伊人蕉在人依线| 免费无码VA一区二区三区 | 国产女高清在线看免费观看| 亚洲 欧洲 自拍 另类 校园| 免费无码AV电影在线观看| 亚洲kkk4444在线观看| 成在人线AV无码免费| 亚洲色大情网站www| 日韩成人免费在线| 羞羞视频免费观看| 亚洲欧洲国产成人综合在线观看 | 免费H网站在线观看的| 亚洲区视频在线观看| 成人免费视频小说| 精品国产日韩亚洲一区在线| 亚洲&#228;v永久无码精品天堂久久| 在线亚洲v日韩v| 亚洲午夜久久久久妓女影院| 久久久精品免费国产四虎| 亚洲黄色在线网站| 日本亚洲免费无线码| 狠狠入ady亚洲精品| 亚洲成AV人片在| 91成年人免费视频| 精品国产亚洲第一区二区三区| 亚洲色精品88色婷婷七月丁香| 88xx成人永久免费观看| 亚洲精品精华液一区二区| 综合亚洲伊人午夜网| 青娱乐免费视频在线观看| 国产成人综合亚洲绿色| 亚洲AV成人无码久久精品老人| 99热在线精品免费全部my| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 国产亚洲成AV人片在线观黄桃| xxxx日本免费| 免费无遮挡无遮羞在线看| 亚洲av激情无码专区在线播放|