欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

一、get方法和load方法的簡(jiǎn)易理解

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3.對(duì)于get方法,hibernate會(huì)確認(rèn)一下該id對(duì)應(yīng)的數(shù)據(jù)是否存在,首先在session緩存中查找,然后在二級(jí)緩存中查找,還沒(méi)有就查數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)中沒(méi)有就返回null。

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

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

(2)總之對(duì)于get和load的根本區(qū)別,一句話,hibernate對(duì)于load方法認(rèn)為該數(shù)據(jù)在數(shù)據(jù)庫(kù)中一定存在,可以放心的使用代理來(lái)延遲加載,如果在使用過(guò)程中發(fā)現(xiàn)了問(wèn)題,只能拋異常;而對(duì)于get方法,hibernate一定要獲取到真實(shí)的數(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é)

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

相關(guān)文章

  • Spring框架web項(xiàng)目實(shí)戰(zhàn)全代碼分享

    Spring框架web項(xiàng)目實(shí)戰(zhàn)全代碼分享

    這篇文章主要介紹了Spring框架web項(xiàng)目實(shí)戰(zhàn)全代碼分享,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • SpringBoot開(kāi)發(fā)技巧啟動(dòng)時(shí)配置校驗(yàn)實(shí)現(xiàn)示例

    SpringBoot開(kāi)發(fā)技巧啟動(dòng)時(shí)配置校驗(yàn)實(shí)現(xiàn)示例

    這篇文章主要為大家介紹了SpringBoot開(kāi)發(fā)在啟動(dòng)時(shí)自動(dòng)配置校驗(yàn)的實(shí)現(xiàn)示例及原理解析,有需要的朋友可以借鑒參考下希望能夠有所幫助
    2021-10-10
  • SpringBoot可視化監(jiān)控的具體應(yīng)用

    SpringBoot可視化監(jiān)控的具體應(yīng)用

    最近越發(fā)覺(jué)得,任何一個(gè)系統(tǒng)上線,運(yùn)維監(jiān)控都太重要了,本文介紹了SpringBoot可視化監(jiān)控的具體應(yīng)用,分享給大家,有興趣的同學(xué)可以參考一下
    2021-06-06
  • SpringBoot JWT令牌的使用

    SpringBoot JWT令牌的使用

    JWT令牌中包含了一個(gè)用戶名和哈希值,這些都需要進(jìn)行驗(yàn)證,本文主要介紹了SpringBoot JWT令牌的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Java虛擬機(jī)JVM性能優(yōu)化(一):JVM知識(shí)總結(jié)

    Java虛擬機(jī)JVM性能優(yōu)化(一):JVM知識(shí)總結(jié)

    這篇文章主要介紹了Java虛擬機(jī)JVM性能優(yōu)化(一):JVM知識(shí)總結(jié),本文是系列文章的第一篇,后續(xù)篇章請(qǐng)繼續(xù)關(guān)注腳本之家,需要的朋友可以參考下
    2014-09-09
  • SpringMVC實(shí)現(xiàn)Validation校驗(yàn)過(guò)程詳解

    SpringMVC實(shí)現(xiàn)Validation校驗(yàn)過(guò)程詳解

    這篇文章主要介紹了SpringMVC實(shí)現(xiàn)Validation校驗(yàn)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Java簡(jiǎn)單模擬實(shí)現(xiàn)一個(gè)線程池

    Java簡(jiǎn)單模擬實(shí)現(xiàn)一個(gè)線程池

    本文主要介紹了Java簡(jiǎn)單模擬實(shí)現(xiàn)一個(gè)線程池,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01
  • 利用java實(shí)現(xiàn)中獎(jiǎng)概率詳情

    利用java實(shí)現(xiàn)中獎(jiǎng)概率詳情

    這篇文章主要介紹了利用java實(shí)現(xiàn)中獎(jiǎng)概率詳情,根據(jù)概率將獎(jiǎng)品劃分區(qū)間,每個(gè)區(qū)間代表一個(gè)獎(jiǎng)品,然后抽取???隨機(jī)數(shù)??,反查落在那個(gè)區(qū)間上,即為所抽取的獎(jiǎng)品,需要的朋友可以參考一下
    2022-07-07
  • 一文詳解Spring?AOP的配置與使用

    一文詳解Spring?AOP的配置與使用

    面向切面編程(俗稱AOP)提供了一種面向?qū)ο缶幊?俗稱OOP)的補(bǔ)充,面向?qū)ο缶幊套詈诵牡膯卧穷?class),然而面向切面編程最核心的單元是切面(Aspects)。本文就來(lái)和大家聊聊AOP的配置與使用,感興趣的可以了解一下
    2022-11-11
  • Springboot自定義全局異常問(wèn)題

    Springboot自定義全局異常問(wèn)題

    這篇文章主要介紹了Springboot自定義全局異常問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05

最新評(píng)論