一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - Java教程 - Hibernate中Session.get()方法和load()方法的詳細比較

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

2021-07-26 11:39徐劉根 Java教程

今天小編就為大家分享一篇關于Hibernate中Session.get()方法和load()方法的詳細比較,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧

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

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

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

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

(4)get和load查詢數據庫

1. 如果查詢不到數據,get 會返回 null,但是不會報錯, load 如果查詢不到數據,則報錯objectnotfoundexception

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

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

?
1
<class name="employee" lazy="false" table="employee">

二、結合緩存技術比較get和load區別

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

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

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

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

三、深入區別get方法和load方法

(1)hibernate中get方法和load方法的根本區別在于:

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

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

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

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

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

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

四、load和get方法的使用

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/**
 * 比較load方法和get方法的區別
 **/
 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();
 }
 }
 }

總結

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

原文鏈接:https://blog.csdn.net/xlgen157387/article/details/39779973

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产免费一区二区三区 | 日本高清视频在线免费观看 | 成人国产午夜在线视频 | 日本一在线中文字幕天堂 | 窝窝午夜理伦影院 | 欧美日韩视频一区三区二区 | 国产成人久久久精品一区二区三区 | 国产午夜免费 | 视频二区 素人 欧美 日韩 | 深夜精品高中女学生 | 婷婷丁香视频 | 四虎成人免费观看在线网址 | 精品在线一区 | 国产成人亚洲综合a∨婷婷 国产成人亚洲精品乱码在线观看 | 91一个人的在线观看www | 成年人免费观看 | 欧美一级鲁丝片免费看 | 免费在线观看亚洲 | 深夜在线看 | 999任你躁在线精品免费不卡 | 60岁妇女毛片免费观看 | 精品视频在线观看免费 | 非洲黑人又大粗gay 非洲黑人bbwbbwbbw | 欧美色精品天天在线观看视频 | 91麻豆精品国产片在线观看 | 91在线视频播放 | 99热com| 午夜深情在线观看免费 | 亚洲国产成人在人网站天堂 | xxxx野外性xxxx | 性印度freehd | 精品久久久久久国产91 | 国产福利资源 | 日韩毛片高清在线看 | 亚洲免费黄色网 | 美女大乳被捏羞羞漫画 | 亚洲乱亚洲乱妇41p国产成人 | 日韩天堂在线 | 好大好硬好长好爽a网站 | 日韩网站在线观看 | 白丝爆动漫羞羞动漫网站 |