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

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

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

    隨筆-57  評論-202  文章-17  trackbacks-0
          Session.get/load的區別:
          1.如果未能發現符合條件的記錄,get方法返回null,而load方法會拋出一個ObejctNotFoundException。
          2.Load方法可返回實體的代理類類型,而get方法永遠直接返回實體類。
          3.Load方法可以充分利用內部緩存和二級緩存中現有數據,而get方法則僅僅在內部緩存中進行數據查找,如沒有發現對應數據,將越過二級緩存,直接調用SQL完成數據讀取。



          Session.find/iterate的區別:
          find方法將執行Select SQL從數據庫中獲得所有符合條件的記錄并構造相應的實體對象,實體對象構建完畢之后,就將其納入緩存。它對緩存只寫不讀,因此無法利用緩存。
          iterate方法首先執行一條Select SQL以獲得所有符合查詢條件的數據id,隨即,iterate方法首先在本地緩存中根據id查找對應的實體對象是否存在,如果緩存中已經存在對應的數據,則直接以此數據對象作為查詢結果,如果沒有找到,再執行相應的Select語句獲得對應的庫表記錄(iterate方法如果執行了數據庫讀取操作并構建了完整的數據對象,也會將其查詢結果納入緩存)。



          Query Cache產生作用的情況:
          1.完全相同的Select SQL重復執行。
          2.在兩次查詢之間,此Select SQL對應的庫表沒有發生過改變。



          Session.save方法的執行步驟:
          1.在Session內部緩存中尋找待保存對象。內部緩存命中,則認為此數據已經保存(執行過insert操作),實體對象已經處于Persistent狀態,直接返回。
          2.如果實體類實現了lifecycle接口,則調用待保存對象的onSave方法。
          3.如果實體類實現了validatable接口,則調用其validate()方法。
          4.調用對應攔截器的Interceptor.onSave方法(如果有的話)。
          5.構造Insert SQL,并加以執行。
          6.記錄插入成功,user.id屬性被設定為insert操作返回的新記錄id值。
          7.將user對象放入內部緩存。
          8.最后,如果存在級聯關系,對級聯關系進行遞歸處理。



          Session.update方法的執行步驟:
          1.根據待更新實體對象的Key,在當前session的內部緩存中進行查找,如果發現,則認為當前實體對象已經處于Persistent狀態,返回。
          2.初始化實體對象的狀態信息(作為之后臟數據檢查的依據),并將其納入內部緩存。注意這里Session.update方法本身并沒有發送Update SQL完成數據更新操作,Update SQL將在之后的Session.flush方法中執行(Transaction.commit在真正提交數據庫事務之前會調用Session.flush)。


          Session.saveOrUpdate方法的執行步驟:
          1.首先在Session內部緩存中進行查找,如果發現則直接返回。
          2.執行實體類對應的Interceptor.isUnsaved方法(如果有的話),判斷對象是否為未保存狀態。
          3.根據unsaved-value判斷對象是否處于未保存狀態。
          4.如果對象未保存(Transient狀態),則調用save方法保存對象。
          5.如果對象為已保存(Detached狀態),調用update方法將對象與Session重新關聯。

    posted on 2005-07-12 18:49 小米 閱讀(4910) 評論(5)  編輯  收藏 所屬分類: Hibernate

    評論:
    # re: 《深入淺出Hibernate》讀書筆記(5)——持久層操作 2005-12-16 16:08 | Sometimes Java
    對find和iterate兩個查詢方法的比較,并不完善,你這種斷章取義的總結容易誤導別人.

    你的敘述在暗示一種結論:iterate方法比find更好,因為它更好的利用了緩存.實際的情況是,如果使用了iterate方法返回Iterator類型的查詢結果,那么你一旦關閉session,Iterator中的數據立即就會消失.而通過find得到的List則不會如此,我想大部分人的使用習慣都是操作完成后立即關閉session,很多公司也強制要求這樣做.

    Iterator的另一個麻煩事是fail-fast,在多線程環境下,很容易產生.使用線程安全的List子類,則不會有這個問題  回復  更多評論
      
    # 學習到新東西了,) 2006-03-30 10:39 | SunofMay
    謝謝!
    希望能看到更多好的東西!  回復  更多評論
      
    # re: 《深入淺出Hibernate》讀書筆記(5)——持久層操作 2006-10-19 15:34 | lujh
    而get方法并不永遠直接返回實體類,當某對象已經由于其他對象的關聯而產生了代理類對象時,用get方法返回的仍是該代理對象。  回復  更多評論
      
    # re: 《深入淺出Hibernate》讀書筆記(5)——持久層操作 2006-10-19 15:36 | lujh
    這不知道是不是一個bug
      回復  更多評論
      
    # re: 《深入淺出Hibernate》讀書筆記(5)——持久層操作 2008-05-29 13:19 | dreamli
    寫的很好!  回復  更多評論
      
    主站蜘蛛池模板: 又长又大又粗又硬3p免费视频| 免费无码作爱视频| 久久国产乱子精品免费女| 无码人妻久久一区二区三区免费丨 | www视频在线观看免费| 国产成人高清精品免费软件| 亚洲成色在线综合网站| 亚洲日韩国产欧美一区二区三区 | 欧亚一级毛片免费看| 最近中文字幕mv免费高清在线| 国产大片91精品免费看3| 亚洲av激情无码专区在线播放| 亚洲精品成a人在线观看☆| 另类免费视频一区二区在线观看| 日韩在线看片免费人成视频播放| 亚洲av无码专区国产乱码在线观看 | 免费一级做a爰片久久毛片潮| 59pao成国产成视频永久免费| 亚洲福利精品电影在线观看| 亚洲国产精品成人综合色在线婷婷 | 国产一区二区三区免费视频| 亚洲无限乱码一二三四区| 精品无码一级毛片免费视频观看 | 久久精品国产亚洲AV电影网| 久久99青青精品免费观看| 亚洲国产精品成人AV无码久久综合影院| 亚洲激情电影在线| 中文字幕av免费专区| 国产大片51精品免费观看| 亚洲AV无码国产精品色| 免费黄网站在线看| 亚洲精品乱码久久久久久蜜桃 | 国产中文字幕在线免费观看| 日韩免费视频播播| 亚洲一区在线免费观看| 日本一区二区免费看| 亚洲日本va午夜中文字幕久久| 亚洲乱色伦图片区小说| 日本阿v免费费视频完整版| 亚洲AV无码专区电影在线观看| 免费精品视频在线|