<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)計

    積分與排名

    好友之家

    最新評論

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

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

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

    save()和persist()將會引發(fā)SQL的INSERT,delete()會引發(fā)SQLDELETE,
    而update()或merge()會引發(fā)SQLUPDATE。對持久化(persistent)實例的修改在刷新提交的時候會被檢測到,
    它也會引起SQLUPDATE。saveOrUpdate()或者replicate()會引發(fā)SQLINSERT或者UPDATE

    二、save 和update區(qū)別
    把這一對放在第一位的原因是因為這一對是最常用的。
    save的作用是把一個新的對象保存
    update是把一個脫管狀態(tài)的對象保存

    三,update 和saveOrUpdate區(qū)別
    這個是比較好理解的,顧名思義,saveOrUpdate基本上就是合成了save和update
    引用hibernate reference中的一段話來解釋他們的使用場合和區(qū)別
    通常下面的場景會使用update()或saveOrUpdate():
    程序在第一個session中加載對象
    該對象被傳遞到表現(xiàn)層
    對象發(fā)生了一些改動
    該對象被返回到業(yè)務邏輯層
    程序調(diào)用第二個session的update()方法持久這些改動

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

    四,persist和save區(qū)別
    這個是最迷離的一對,表面上看起來使用哪個都行,在hibernate reference文檔中也沒有明確的區(qū)分他們.
    這里給出一個明確的區(qū)分。(可以跟進src看一下,雖然實現(xiàn)步驟類似,但是還是有細微的差別)
    這里參考http://opensource.atlassian.com/projects/hibernate/browse/HHH-1682中的一個說明:
    ---------------------------------------------------------------------------------
    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把一個瞬態(tài)的實例持久化,但是并"不保證"標識符被立刻填入到持久化實例中,標識符的填入可能被推遲
    到flush的時間。

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

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


    五,saveOrUpdateCopy,merge和update區(qū)別
    首先說明merge是用來代替saveOrUpdateCopy的,這個詳細見這里
    http://www.tkk7.com/dreamstone/archive/2007/07/28/133053.html
    然后比較update和merge
    update的作用上邊說了,這里說一下merge的
    如果session中存在相同持久化標識(identifier)的實例,用用戶給出的對象的狀態(tài)覆蓋舊有的持久實例
    如果session沒有相應的持久實例,則嘗試從數(shù)據(jù)庫中加載,或創(chuàng)建新的持久化實例,最后返回該持久實例
    用戶給出的這個對象沒有被關聯(lián)到session上,它依舊是脫管的
    重點是最后一句:
    當我們使用update的時候,執(zhí)行完成后,我們提供的對象A的狀態(tài)變成持久化狀態(tài)
    但當我們使用merge的時候,執(zhí)行完成,我們提供的對象A還是脫管狀態(tài),hibernate或者new了一個B,或者檢索到
    一個持久對象B,并把我們提供的對象A的所有的值拷貝到這個B,執(zhí)行完成后B是持久狀態(tài),而我們提供的A還是托管狀態(tài)

    六,flush和update區(qū)別
    這兩個的區(qū)別好理解
    update操作的是在脫管狀態(tài)的對象
    而flush是操作的在持久狀態(tài)的對象。
    默認情況下,一個持久狀態(tài)的對象是不需要update的,只要你更改了對象的值,等待hibernate flush就自動
    保存到數(shù)據(jù)庫了。hibernate flush發(fā)生再幾種情況下:
    1,調(diào)用某些查詢的時候
    2,transaction commit的時候
    3,手動調(diào)用flush的時候

    七,lock和update區(qū)別
    update是把一個已經(jīng)更改過的脫管狀態(tài)的對象變成持久狀態(tài)
    lock是把一個沒有更改過的脫管狀態(tài)的對象變成持久狀態(tài)
    對應更改一個記錄的內(nèi)容,兩個的操作不同:
    update的操作步驟是:
    (1)更改脫管的對象->調(diào)用update
    lock的操作步驟是:
    (2)調(diào)用lock把對象從脫管狀態(tài)變成持久狀態(tài)-->更改持久狀態(tài)的對象的內(nèi)容-->等待flush或者手動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) 評論(13)  編輯  收藏 所屬分類: dao層框架

    評論

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

    總結得不錯.  回復  更多評論   

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

    在你文章的開頭部分,有這樣一句話:“持久化實例可以通過調(diào)用 delete()變成脫管狀態(tài)?!?br>
    但是Hibernate手冊在10.8小節(jié)是這樣寫的:
    It's best to think of delete() as making a persistent instance transient.   回復  更多評論   

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

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

      回復  更多評論   

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

    牛B大了  回復  更多評論   

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

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

    這句是不是有誤,"脫管狀態(tài)"應該為"瞬時狀態(tài)"?  回復  更多評論   

    # 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)  回復  更多評論   

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

    受教了  回復  更多評論   

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

    寫的不錯,通俗易懂  回復  更多評論   

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

    總結的好,雖然有些小問題,很不錯  回復  更多評論   

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

    @Andycpp哥們你要是查查翻譯就好了,它就是說delete()方法是把持久化態(tài)變成瞬態(tài)?。。。。?br>  回復  更多評論   

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

    內(nèi)容有些寫錯了  回復  更多評論   

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

    挺模糊,不過挺有用的  回復  更多評論   

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

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

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

    save()和persist()將會引發(fā)SQL的INSERT,delete()會引發(fā)SQLDELETE,
    而update()或merge()會引發(fā)SQLUPDATE。對持久化(persistent)實例的修改在刷新提交的時候會被檢測到,
    它也會引起SQLUPDATE。saveOrUpdate()或者replicate()會引發(fā)SQLINSERT或者UPDATE

    二、save 和update區(qū)別
    把這一對放在第一位的原因是因為這一對是最常用的。
    save的作用是把一個新的對象保存
    update是把一個脫管狀態(tài)的對象保存

    三,update 和saveOrUpdate區(qū)別
    這個是比較好理解的,顧名思義,saveOrUpdate基本上就是合成了save和update
    引用hibernate reference中的一段話來解釋他們的使用場合和區(qū)別
    通常下面的場景會使用update()或saveOrUpdate():
    程序在第一個session中加載對象
    該對象被傳遞到表現(xiàn)層
    對象發(fā)生了一些改動
    該對象被返回到業(yè)務邏輯層
    程序調(diào)用第二個session的update()方法持久這些改動

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

    四,persist和save區(qū)別
    這個是最迷離的一對,表面上看起來使用哪個都行,在hibernate reference文檔中也沒有明確的區(qū)分他們.
    這里給出一個明確的區(qū)分。(可以跟進src看一下,雖然實現(xiàn)步驟類似,但是還是有細微的差別)
    這里參考http://opensource.atlassian.com/projects/hibernate/browse/HHH-1682中的一個說明" target="_new" rel="nofollow">http://opensource.atlassian.com/projects/hibernate/browse/HHH-1682中的一個說明:
    ---------------------------------------------------------------------------------
    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把一個瞬態(tài)的實例持久化,但是并"不保證"標識符被立刻填入到持久化實例中,標識符的填入可能被推遲
    到flush的時間。

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

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


    五,saveOrUpdateCopy,merge和update區(qū)別
    首先說明merge是用來代替saveOrUpdateCopy的,這個詳細見這里
    http://www.tkk7.com/dreamstone/archive/2007/07/28/133053.html
    然后比較update和merge
    update的作用上邊說了,這里說一下merge的
    如果session中存在相同持久化標識(identifier)的實例,用用戶給出的對象的狀態(tài)覆蓋舊有的持久實例
    如果session沒有相應的持久實例,則嘗試從數(shù)據(jù)庫中加載,或創(chuàng)建新的持久化實例,最后返回該持久實例
    用戶給出的這個對象沒有被關聯(lián)到session上,它依舊是脫管的
    重點是最后一句:
    當我們使用update的時候,執(zhí)行完成后,我們提供的對象A的狀態(tài)變成持久化狀態(tài)
    但當我們使用merge的時候,執(zhí)行完成,我們提供的對象A還是脫管狀態(tài),hibernate或者new了一個B,或者檢索到
    一個持久對象B,并把我們提供的對象A的所有的值拷貝到這個B,執(zhí)行完成后B是持久狀態(tài),而我們提供的A還是托管狀態(tài)

    六,flush和update區(qū)別
    這兩個的區(qū)別好理解
    update操作的是在脫管狀態(tài)的對象
    而flush是操作的在持久狀態(tài)的對象。
    默認情況下,一個持久狀態(tài)的對象是不需要update的,只要你更改了對象的值,等待hibernate flush就自動
    保存到數(shù)據(jù)庫了。hibernate flush發(fā)生再幾種情況下:
    1,調(diào)用某些查詢的時候
    2,transaction commit的時候
    3,手動調(diào)用flush的時候

    七,lock和update區(qū)別
    update是把一個已經(jīng)更改過的脫管狀態(tài)的對象變成持久狀態(tài)
    lock是把一個沒有更改過的脫管狀態(tài)的對象變成持久狀態(tài)
    對應更改一個記錄的內(nèi)容,兩個的操作不同:
    update的操作步驟是:
    (1)更改脫管的對象->調(diào)用update
    lock的操作步驟是:
    (2)調(diào)用lock把對象從脫管狀態(tài)變成持久狀態(tài)-->更改持久狀態(tài)的對象的內(nèi)容-->等待flush或者手動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) 評論(12) 編輯 收藏 所屬分類: dao層框架  回復  更多評論   

    主站蜘蛛池模板: 国产成人A在线观看视频免费 | 中国精品一级毛片免费播放| 午夜无遮挡羞羞漫画免费| 亚洲视频在线观看视频| 亚洲免费在线观看视频| 亚洲精品不卡视频| 免费精品国产自产拍在线观看图片 | 亚洲成A∨人片在线观看无码| 9420免费高清在线视频| 亚洲精品资源在线| 成年女人18级毛片毛片免费| 亚洲熟妇AV日韩熟妇在线| 国产麻豆免费观看91| 永久免费观看黄网站| 亚洲国产精品无码久久SM| 三年片在线观看免费观看大全动漫 | 久久精品国产精品亚洲艾草网| 日韩精品免费视频| 亚洲人成综合在线播放| 美女黄网站人色视频免费国产| 免费无码婬片aaa直播表情| 中文字幕亚洲激情| 222www免费视频| 久久亚洲精品高潮综合色a片| 亚洲成A人片在线观看无码3D| 国产免费AV片在线观看| 亚洲国产亚洲片在线观看播放| 国产精品久免费的黄网站| 久久久久女教师免费一区| 亚洲精品国产啊女成拍色拍| 精品免费国产一区二区| 一级毛片不卡免费看老司机| 老司机亚洲精品影院无码| 精品久久免费视频| 在线观看免费播放av片| 一区二区亚洲精品精华液| 亚洲愉拍99热成人精品热久久| 91久久精品国产免费直播| 青青视频免费在线| 亚洲欧洲精品视频在线观看| 国产免费人视频在线观看免费|