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

Hibernate中Session.get()方法和load()方法的詳細比較

 更新時間:2019年03月29日 16:10:01   作者:徐劉根  
今天小編就為大家分享一篇關(guān)于Hibernate中Session.get()方法和load()方法的詳細比較,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧

一、get方法和load方法的簡易理解

(1)get()方法直接返回實體類,如果查不到數(shù)據(jù)則返回null。load()會返回一個實體代理對象(當前這個對象可以自動轉(zhuǎn)化為實體對象),但當代理對象被調(diào)用時,如果沒有數(shù)據(jù)不存在,就會拋出個org.hibernate.ObjectNotFoundException異常

(2)load先到緩存(session緩存/二級緩存)中去查,如果沒有則返回一個代理對象(不馬上到DB中去找),等后面使用這個代理對象操作的時候,才到DB中查詢,這就是我們常說的 load在默認情況下支持延遲加載(lazy)

(3) get先到緩存(session緩存/二級緩存)中去查,如果沒有就到DB中去查(即馬上發(fā)出sql)??傊?,如果你確定DB中有這個對象就用load(),不確定就用get()(這樣效率高)

(4)get和load查詢數(shù)據(jù)庫

1. 如果查詢不到數(shù)據(jù),get 會返回 null,但是不會報錯, load 如果查詢不到數(shù)據(jù),則報錯ObjectNotFoundException

2. 使用get 去查詢數(shù)據(jù),(先到一級/二級)會立即向db發(fā)出查詢請求(select ...), 如果你使用的是 load查詢數(shù)據(jù),(先到一級、二級))即使查詢到對象,返回的是一個代理對象,如果后面沒有使用查詢結(jié)果,它不會真的向數(shù)據(jù)庫發(fā)select ,當程序員使用查詢結(jié)果的時候才真的發(fā)出select ,這個現(xiàn)象我們稱為懶加載(lazy)

3. 通過修改配置文件(*.hbm.xml文件),我們可以取消懶加載

<class name="Employee" lazy="false" table="employee"> 

二、結(jié)合緩存技術(shù)比較get和load區(qū)別

注:一級緩存是必須有的,二級緩存是配置的可選(這里解釋的時候默認有二級緩存)

1.get在查詢的時候首先到一級緩存(session級緩存)中查找,沒有的話進入二級緩存(介于內(nèi)存與硬盤之間) 如果二級緩存還沒有則直接進入數(shù)據(jù)庫中查詢!查詢到并將查詢的結(jié)果放入二級緩存!查詢不到不會報錯 如果查詢同一條數(shù)據(jù),get會出現(xiàn)在第一次查詢的時候會出查詢數(shù)據(jù)庫 但是第二次的時候會直接沿著一級緩存、二級緩存查找可以找到!

2.load在查詢的時候也是先到一級緩存中查找,如果找到則不會查詢數(shù)據(jù)庫,如果找不到則依次到二級緩存查找,如果二級緩存中沒有查找的數(shù)據(jù),get方法會根據(jù)是否要立即利用查詢的結(jié)果,如果不利用的話則停止查找;如果要立即使用的話則會進入數(shù)據(jù)庫中查找;查詢到并將查詢的結(jié)果放入二級緩存!查詢不到則會報錯!

三、深入?yún)^(qū)別get方法和load方法

(1)hibernate中g(shù)et方法和load方法的根本區(qū)別在于:

1.如果你使用load方法,hibernate認為該id對應的對象(數(shù)據(jù)庫記錄)在數(shù)據(jù)庫中是一定存在的,所以它可以放心的使用,它可以放心的使用代理來延遲加載該對象。在用到對象中的其他屬性數(shù)據(jù)時才查詢數(shù)據(jù)庫,但是萬一數(shù)據(jù)庫中不存在該記錄,那沒辦法,只能拋異常,所說的load方法拋異常是指在使用該對象的數(shù)據(jù)時,數(shù)據(jù)庫中不存在該數(shù)據(jù)時拋異常,而不是在創(chuàng)建這個對象時。

2.由于 session中的緩存對于hibernate來說是個相當廉價的資源,所以在load時會先查一下session緩存看看該id對應的對象是否存在,不存在則創(chuàng)建代理。所以如果你知道該id在數(shù)據(jù)庫中一定有對應記錄存在就可以使用load方法來實現(xiàn)延遲加載。

3.對于get方法,hibernate會確認一下該id對應的數(shù)據(jù)是否存在,首先在session緩存中查找,然后在二級緩存中查找,還沒有就查數(shù)據(jù)庫,數(shù)據(jù)庫中沒有就返回null。

4.get方法如果在session緩存中找到了該id 對應的對象,如果剛好該對象前面是被代理過的,如被load方法使用過,或者被其他關(guān)聯(lián)對象延遲加載過,那么返回的還是原先的代理對象,而不是實體類對象,如果該代理對象還沒有加載實體數(shù)據(jù)(就是id以外的其他屬性數(shù)據(jù)),那么它會查詢二級緩存或者數(shù)據(jù)庫來加載數(shù)據(jù),但是返回的還是代理對象,只不過已經(jīng)加載了實體數(shù)據(jù)。

5.get方法首先查詢session緩存,沒有的話查詢二級緩存,最后查詢數(shù)據(jù)庫;反而load方法創(chuàng)建時首先查詢session緩存,沒有就創(chuàng)建代理,實際使用數(shù)據(jù)時才查詢二級緩存和數(shù)據(jù)庫。

(2)總之對于get和load的根本區(qū)別,一句話,hibernate對于load方法認為該數(shù)據(jù)在數(shù)據(jù)庫中一定存在,可以放心的使用代理來延遲加載,如果在使用過程中發(fā)現(xiàn)了問題,只能拋異常;而對于get方法,hibernate一定要獲取到真實的數(shù)據(jù),否則返回null。

四、load和get方法的使用

/**
 * 比較load方法和get方法的區(qū)別
 **/
 public static void CompareLoadAndGet(){
 Configuration configuration = new Configuration().configure();
 SessionFactory sessionFactory = configuration.buildSessionFactory();
 Session session = sessionFactory.openSession();
 Transaction ts = null;
 Transaction ts1 = null;
 try {
 /**
 * 使用load方法
 **/
 ts = session.beginTransaction();
 Employee emp= (Employee) session.load(Employee.class, 9);
 System.out.println("load方法獲取的員工姓名:"+emp.getName());
 ts.commit();
 /**
 * 使用get方法
 **/
 ts1 = session.beginTransaction();
 Employee emp1= (Employee) session.get(Employee.class, 9);
 System.out.println("get方法獲取的員工姓名:"+emp1.getName());
 ts1.commit();
 } 
// catch (Exception e) {
// if(ts!=null){
// ts.rollback();
// }
// }
 finally{
 if(session!=null&&session.isOpen()){
 session.close();
 }
 }
 }

總結(jié)

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

相關(guān)文章

  • Spring Boot 實現(xiàn)程序的優(yōu)雅退出(詳細步驟)

    Spring Boot 實現(xiàn)程序的優(yōu)雅退出(詳細步驟)

    Spring Boot 為我們提供了優(yōu)雅退出的功能,使應用程序能夠在關(guān)閉時正常處理完所有當前請求,避免請求被中斷導致數(shù)據(jù)丟失或不一致等問題,本文將全面介紹如何在 Spring Boot 應用程序中實現(xiàn)優(yōu)雅退出,感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • JMeter中的后端監(jiān)聽器的實現(xiàn)

    JMeter中的后端監(jiān)聽器的實現(xiàn)

    本文主要介紹了JMeter中的后端監(jiān)聽器的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 舉例講解Java中的多線程編程

    舉例講解Java中的多線程編程

    這篇文章主要介紹了舉例講解Java中的多線程編程,線程是Java學習中的重要知識,需要的朋友可以參考下
    2015-09-09
  • mybatis 一對多嵌套查詢的實現(xiàn)

    mybatis 一對多嵌套查詢的實現(xiàn)

    本文主要介紹了mybatis 一對多嵌套查詢的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-07-07
  • Spring security用戶URL權(quán)限FilterSecurityInterceptor使用解析

    Spring security用戶URL權(quán)限FilterSecurityInterceptor使用解析

    這篇文章主要介紹了Spring security用戶URL權(quán)限FilterSecurityInterceptor使用解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • java多線程之Future和FutureTask使用實例

    java多線程之Future和FutureTask使用實例

    這篇文章主要介紹了java多線程之Future和FutureTask使用實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • 源碼解析springbatch的job運行機制

    源碼解析springbatch的job運行機制

    這篇文章主要介紹了springbatch的job是如何運行的,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • 舉例講解Java中final關(guān)鍵字的用法

    舉例講解Java中final關(guān)鍵字的用法

    Java中的final關(guān)鍵字可以被用來修飾變量、方法和類等,意味著終結(jié)、不可改變,下面我們就來舉例講解Java中final關(guān)鍵字的用法:
    2016-06-06
  • Java下載文件的4種方式總結(jié)

    Java下載文件的4種方式總結(jié)

    這篇文章主要給大家總結(jié)介紹了關(guān)于Java下載文件的4種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • 關(guān)于java.lang.NumberFormatException: null的問題及解決

    關(guān)于java.lang.NumberFormatException: null的問題及解決

    這篇文章主要介紹了關(guān)于java.lang.NumberFormatException: null的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09

最新評論

江孜县| 泾阳县| 普安县| 孙吴县| 新丰县| 肥东县| 商都县| 东平县| 克什克腾旗| 屏山县| 巴青县| 宝丰县| 桂阳县| 比如县| 翁牛特旗| 会泽县| 长汀县| 玉林市| 正阳县| 南乐县| 临澧县| 阳西县| 青铜峡市| 汤原县| 肇东市| 浮山县| 班戈县| 铅山县| 廊坊市| 南和县| 葫芦岛市| 封开县| 石狮市| 黄陵县| 永年县| 色达县| 凯里市| 济南市| 新闻| 西乌| 宣化县|