掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢(xún)/運(yùn)營(yíng)咨詢(xún)/技術(shù)建議/互聯(lián)網(wǎng)交流
大家都知道Hibernate可以充分有效的使用批量抓取,也就是說(shuō),如果僅一個(gè)訪(fǎng)問(wèn)代理(或集合),那么Hibernate將不載入其他未實(shí)例化的代理。

創(chuàng)新互聯(lián)公司是一家專(zhuān)業(yè)提供宜春企業(yè)網(wǎng)站建設(shè),專(zhuān)注與做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、成都h5網(wǎng)站建設(shè)、小程序制作等業(yè)務(wù)。10年已為宜春眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專(zhuān)業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。
Hibernate批量抓取是延遲查詢(xún)抓取的優(yōu)化方案,你可以在兩種Hibernate批量抓取方案之間進(jìn)行選擇:在類(lèi)級(jí)別和集合級(jí)別。
類(lèi)/實(shí)體級(jí)別的批量抓取很容易理解。假設(shè)你在運(yùn)行時(shí)將需要面對(duì)下面的問(wèn)題:你在一個(gè)Session中載入了25個(gè)Cat實(shí)例,每個(gè)Cat實(shí)例都擁有一個(gè)引用成員owner, 其指向Person,而Person類(lèi)是代理,同時(shí)lazy="true"。
如果你必須遍歷整個(gè)cats集合,對(duì)每個(gè)元素調(diào)用getOwner()方法,Hibernate將會(huì)默認(rèn)的執(zhí)行25次SELECT查詢(xún),得到其owner的代理對(duì)象。這時(shí),你可以通過(guò)在映射文件的Person屬性,顯式聲明batch-size,改變其行為:
name="Person" batch-size="10">...
隨之,Hibernate將只需要執(zhí)行三次查詢(xún),分別為10、10、 5。
你也可以在集合級(jí)別定義批量抓取。例如,如果每個(gè)Person都擁有一個(gè)延遲載入的Cats集合,現(xiàn)在,Sesssion中載入了10個(gè)person對(duì)象,遍歷person集合將會(huì)引起10次SELECT查詢(xún),每次查詢(xún)都會(huì)調(diào)用getCats()方法。如果你在Person的映射定義部分,允許對(duì)cats批量抓取, 那么,Hibernate將可以預(yù)先抓取整個(gè)集合。
請(qǐng)看例子:
name="Person"> name="cats" batch-size="3"> - ...
如果整個(gè)的batch-size是3(筆誤?),那么Hibernate將會(huì)分四次執(zhí)行SELECT查詢(xún),按照3、3、3、1的大小分別載入數(shù)據(jù)。這里的每次載入的數(shù)據(jù)量還具體依賴(lài)于當(dāng)前Session中未實(shí)例化集合的個(gè)數(shù)。
如果你的模型中有嵌套的樹(shù)狀結(jié)構(gòu),例如典型的帳單-原料結(jié)構(gòu)(bill-of-materials pattern),集合的Hibernate批量抓取是非常有用的。(盡管在更多情況下對(duì)樹(shù)進(jìn)行讀取時(shí),嵌套集合(nested set)或原料路徑(materialized path)(××) 是更好的解決方法。)
【編輯推薦】

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢(xún)/運(yùn)營(yíng)咨詢(xún)/技術(shù)建議/互聯(lián)網(wǎng)交流