Hibernate之加載策略(延遲加載與即時加載)和抓取策略(fetch)

  假設現在有Book和Category兩張表,表的關系為雙向的一對多,表結構如下:

  假設現在我想查詢id為2的那本書的書名,使用session.get(...)方法:

1 Session session=HibernateUtil.getSession();
2 Book book =(Book) session.get(Book.class,2);
3 System.out.println(book.getName());

  當執行完第二行代碼,還未執行第三行時,控制臺已經打印出了sql語句,執行第三行時打印出書名"斗破蒼穹".

  而如果使用session.load(..)查詢時:

1 Session session=HibernateUtil.getSession();
2 Book book =(Book) session.load(Book.class,1);
3 System.out.println(book.getName());

  當執行完第二行代碼還未執行第三行時,控制臺什么都沒有打印,執行第三行時,控制臺打印出sql語句和書名"斗破蒼穹".

  看出get和load的區別了嗎?

  實際上,當使用get方法查詢時,程序立即去訪問數據庫(實際上是先去一級緩存session中查詢,沒有發現的話再去二級緩存,再沒有的話才去訪問數據庫),得到id=2的Book,并且打印出sql語句,而是用load方法查詢時,load并未立即去訪問數據庫,他先是返回了一個Book的代理對象,當你真正要用到Book中信息時,才去訪問數據庫.load支持延遲加載,get不支持延遲加載,當然如果設置了lazy=false,get和load都會直接去訪問數據庫,都變成即時加載.

  get/load方法還有一個很重要的區別就是:

    load方式檢索不到的話會拋出org.hibernate.ObjectNotFoundException異常
    get方法檢索不到的話會返回null

  這就引出了即時加載和延時加載的概念,通俗的說,即時加載,就是立即去數據庫查找,延遲加載,就是真正需要的時候才去數據庫查找,這類似于單例模式中的懶漢式和餓漢式的加載方式.

  假設我現在想通過查詢Book,來得到Book所對應的Category,如果設置為即時加載,當加載Book時,會自動加載Category,如果設置為延遲加載,則加載Book時,不會加載Category,只有當第一次調用getCategory(),時,才去執行sql語句,加載Category.

  一般來說,延遲加載要比即時加載節省資源,但是如果處理不當,延遲加載容易拋出延遲加載異常(LazyInitializationException).這是因為延遲加載時,只有第一次調用getCategory()時才會加載Category數據,如果這時候數據庫連接已經關閉了,就會因為無法加載數據而拋出異常.

  在*.hbm.xml中可以設置加載方式,class標簽中可以設置:lazy="true",打開延遲加載,默認就是lazy="true".

  在set/bag標簽下,默認也是lazy="true",支持延遲加載,也叫懶加載.

  單端關聯(many_to_one或者one_to_one)上也可以設置lazy="true".默認也是true支持懶加載.

下面是網絡上一段關于get和load方法的詳細異同,寫的不錯,貼在這里:

 一、get和load方法都是根據id去獲得對應數據的,但是獲得機制不同:如果使用get方法,hibernate會去確認該id對應的數據是否存在,它首先會去session中去查詢(session緩存其實就hibernate的一級緩存),如果沒有,再去二級緩存中去查詢,如果再沒有,就去數據庫中查詢,仍然沒有找到的話,就返回null

  而使用load方法的話,hibernate會認定該id對應的數據一定存在,它也會先去session緩存中去查找,如果沒有找到,hibernate會根據lazy屬性值來確定是否使用延遲加載。如果lazy=‘true’ ,就使用延遲加載,返回該代理對象,等到真正訪問到該對象的屬性時才會去二級緩存中查詢,如果沒有,再去數據庫中查詢,如果還沒有,就拋出org.hibernate.ObjectNotFoundException異常。如果lazy='false' 則不使用延遲加載,這是load的訪問機制就和get一樣了。

  二、對于load和get方法返回類型:雖然好多書中都這么說:“get()永遠只返回實體類”,但實際上這是不正確的,get方法如果在 session緩存中找到了該id對應的對象,如果剛好該對象前面是被代理過的,如被load方法使用過,或者被其他關聯對象延遲加載過,那么返回的還是 原先的代理對象,而不是實體類對象,如果該代理對象還沒有加載實體數據(就是id以外的其他屬性數據),那么它會查詢二級緩存或者數據庫來加載數據,但是 返回的還是代理對象,只不過已經加載了實體數據。

?

?

?


抓取策略:

  在hibernate的官方文檔中對于抓取策略,是這么定義的:

當應用程序需要在(hibernate實體對象圖的)關聯關系間進行對象導航的時候,hibernate如何獲取關聯對象的策略.

fetch="select":當查詢關聯對象通過select語句去查詢,Select語句的發出時機,是根據lazy的值來確定的,如果lazy="false",那么在獲取對象時,就會發出一條select語句,將關聯對象查詢出來,就是說,我們在查詢Book信息的時候會自動把Category的數據也查詢出來,但如果lazy="true",那么只有在獲取關聯對象的時候才會發出select語句去查詢.

fetch="join":當查詢Book信息時,會通過outer join把關聯的對象Category一起查詢出來,這個時候lazy無效,所有數據會立即查詢出來.

fetch="subselect":如果要查詢關聯集合的內容,會查詢之前已經查詢出來的所有關聯集合的內容,<category對應了多張Book,如果查詢了"玄幻類","武俠類",那么在使用"玄幻類"和"武俠類"對應的集合對象("所對應的書籍信息"),會將他們的書籍信息一并查詢出來,

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/459036.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/459036.shtml
英文地址,請注明出處:http://en.pswp.cn/news/459036.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

指紋圖像方向圖matlab,matlab指紋方向場方向圖程序

function Fangxiangtu zhiwen_fangxiangtu( Zhiwentuxiang )%函數功能計算指紋方向圖%函數參數指紋圖像Zhiwentuxiang%函數返回值指紋方向圖FangxiangtuSizeZhiwentuxiang size( Zhiwentuxiang ) ;Zhiwentuxiang double( Zhiwentuxiang ) ;W 4; % 窗口大小(2W1)*(2W1)W 4;…

怎樣實現一個簡單的jQuery編程

第一步&#xff1a;在head中載入jQuery框架 <script  type"text/javascript" src"jQuery文檔所在的絕對路徑"></script> 注&#xff1a; type——指定腳本的mime類型 src——規定外部腳本文件的URL jQuery是一個javascript庫&#xff0c;相…

php多人點餐可以看到對方點的菜,千萬不要小看你身邊那個會點菜的人,因為

飯局上&#xff0c;你常常是負責點菜的那個人&#xff0c;還是只負責吃&#xff1f;拿起菜單點菜&#xff0c;你是很從容&#xff0c;還是不知道怎么點&#xff1f;事實上&#xff0c;飯局上那個會點菜的人&#xff0c;千萬不能小看。某次隨老板外出開會&#xff0c;跟去的幾個…

gvim for php,轉 : Gvim建立IDE編程環境 (Windows篇)

說明&#xff1a;本文是作者在完全按照著名的《手把手教你把Vim改裝成一個IDE編程環境》一文&#xff0c;在Windows XP上用gvim建立IDE環境時所作的備忘。原作地址&#xff1a;http://blog.csdn.net/wooin/archive/2007/10/31/1858917.aspx。1.安裝gvim7.2。運行gvim72.exe&…

1081. Rational Sum (20) -最大公約數

題目如下&#xff1a; Given N rational numbers in the form "numerator/denominator", you are supposed to calculate their sum. Input Specification: Each input file contains one test case. Each case starts with a positive integer N (<100), followe…

CRC8校驗分析

*************************************************** 更多精彩&#xff0c;歡迎進入&#xff1a;http://shop115376623.taobao.com *************************************************** CRC即循環冗余校驗碼&#xff08;Cyclic Redundancy Check&#xff09;&#xff1a;是…

insert mysql后加where,如何在MySQL Insert語句中添加where子句?

This doesnt work:這不起作用:INSERT INTO users (username, password) VALUES ("Jack","123") WHERE id1;Any ideas how to narrow insertion to a particular row by id?任何想法如何通過id縮小插入到特定行?8 個解決方案#120In an insert statement y…

阿里云使用筆記-Lrzsz上傳下載文件-centos7

2019獨角獸企業重金招聘Python工程師標準>>> 上傳文件時提示&#xff1a; -bash: rz: command not found rz命令沒找到&#xff1f; 執行sz&#xff0c;同樣也沒找到。 原來是要安裝個叫 lrzsz 的東西&#xff0c;一查可以直接yum。 安裝lrzsz&#xff1a;# yum -y …

C#中的DBNull、Null、String.Empty和“”

null可賦值任何變量,將變量置為空 DBNull只用于DataRow對象,表示數據庫中的空值 String.Empty是0長度字串 Convert.IsDBNull判斷是否為DBNull DBNull.Value與Null的區別 Null是.net中無效的對象引用。 DBNull是一個類。DBNull.Value是它唯一的實例。它指數據庫中數據為空(&l…

matlab數值很小出錯,求大神幫忙解決一下,用MATLAB求解動力學數據總是出錯~ - 計算模擬 - 小木蟲 - 學術 科研 互動社區...

CODE:function KineticsEst5 % 動力學ODE方程模型的參數估計%%%% The variables y here are y(1)xB, y(2)xoNB, y(3)xmNB,y(4)xpNB,y(5)xDNB .clear allclck0 [5 5 5 5 5]; % 參數初值lb [0 0 0 0 0]; % 參數下限ub [inf inf inf inf inf]; % 參數上限x0 [0 0 0 0 0 0];Kin…

iOS開發--驗證碼

第一步&#xff0c;拖兩個空間textfiled和button到storyboard上的viewcontroller上。 第二步&#xff0c;拖線&#xff0c;鏈接到.h文件中代碼如下&#xff1a; 1property (weak, nonatomic) IBOutlet UIButton *l_timeButton;第三步&#xff0c;在,m文件中為l_timeButton設置監…

Standard C Episode 8

C語言函數和程序結構 通過函數可以把大的計算任務分解成若干個較小任務&#xff0c;從而使得思路更加清晰&#xff0c;同時函數也大大提高了代碼的復用率&#xff0c;提高了工作效率。要注意的是多函數之間應該盡可能地高聚合低耦合。另一方面&#xff0c;一個程序可以保存在一…

C# Socket 編程詳解

Microsoft.Net Framework為應用程序訪問Internet提供了分層的、可擴展的以及受管轄的網絡服務&#xff0c;其名字空間System.Net和 System.Net.Sockets包含豐富的類可以開發多種網絡應用程序。.Net類采用的分層結構允許應用程序在不同的控制級別上訪問網絡&#xff0c;開發人員…

java 線程池 wait,Java 多線程 之 wait等待 線程實例

package com.wait.notify;/**題目: 人們在火車站的售票窗口排隊買火車票1. 北京西站開門2. 打開售票窗口3. 北京西站有10張去長沙的票4. 打開2個售票窗口,5 假設每個售票窗口每隔1秒鐘買完一張票1. 根據 名詞 找類人們(Person), 火車站(Station),火車票(Ticket) , 售票窗口e 是…

002 exercises

求列表全排列lst [1,2,3] l1 [(x,y,z) for x in lst for y in lst for z in lst if x ! y if y ! z if x ! z] print(l1)給定一個非負整數num,重復的加每一位,直到最后只剩下一位例如: num 38,計算過程如下:3 8 111 1 2最后輸出結果為2#遞歸 def add(num):if len(str(num…

(線段樹 點更新 區間求和)lightoj1112

鏈接&#xff1a; http://acm.hust.edu.cn/vjudge/contest/view.action?cid88230#problem/D &#xff08;密碼0817&#xff09; Description Robin Hood likes to loot rich people since he helps the poor people with this money. Instead of keeping all the money togeth…

TCP/ip通信模式

TCP/IP 應用層與應用程序*************************************************** 更多精彩&#xff0c;歡迎進入&#xff1a;http://shop115376623.taobao.com *************************************************** 文檔出處&#xff1a;http://blog.csdn.net/bingxx11/article…

PHP中判斷空的方法,php中類型判斷和NULL,空值檢查的方法

在一些接口和數據庫的設計中。數據庫的非必填字段可能為null或者為空。這個時候接口前端javascript去判斷的時候就會比較麻煩。為了便于統一的判斷。一律把null和 空裝換成 空.這樣前端的判斷就變得簡潔 if(aa ){........}建議使用 或者 來判斷。。以下是我簡短的一個把數據…

8 Regular Expressions You Should Know

2019獨角獸企業重金招聘Python工程師標準>>> Regular expressions are a language of their own. When you learn a new programming language, theyre this little sub-language that makes no sense at first glance. Many times you have to read another tutori…

poj 3278 catch that cow BFS(基礎水)

Catch That CowTime Limit: 2000MS Memory Limit: 65536KTotal Submissions: 61826 Accepted: 19329Description Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a num…