日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

心得14-hibernate的优化2-抓取(fetch)

發(fā)布時(shí)間:2025/5/22 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 心得14-hibernate的优化2-抓取(fetch) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?在HQL語(yǔ)句中使用抓取連接查詢,通過(guò)寫(xiě)一條left join fetch 語(yǔ)句把相關(guān)聯(lián)的兩個(gè)實(shí)體的數(shù)據(jù)一次性從數(shù)據(jù)庫(kù)中加載上來(lái)。這樣可以在特定情況下(同時(shí)需要使用到這兩個(gè)實(shí)體的數(shù)據(jù))減少SQL的數(shù)量來(lái)提高查詢效率通過(guò)配置“抓取策略”來(lái)直接影響session的get()和load()方法的查詢效果。

1.單端關(guān)聯(lián)<many-to-one><one-to-one>上的抓取策略。

?? 可以給單端關(guān)聯(lián)的映射元素添加fetch屬性。fetch屬性有2個(gè)可選值.

? select:作為默認(rèn)值,它的策略是當(dāng)需要使用到關(guān)聯(lián)對(duì)象的數(shù)據(jù)時(shí),另外單獨(dú)發(fā)送一條select語(yǔ)句抓取當(dāng)前對(duì)象的關(guān)聯(lián)對(duì)象的數(shù)據(jù)。即延遲加載。

??join:它的策略是在同一條select語(yǔ)句使用連接來(lái)獲得對(duì)象的數(shù)據(jù)和它關(guān)聯(lián)對(duì)象的數(shù)據(jù),此時(shí)關(guān)聯(lián)對(duì)象的延遲加載失效。

2.集合屬性上的抓取策略

在集合屬性的映射元素上可以添加fetch屬性,它有3個(gè)可選值。

?select:作為默認(rèn)值,它的策略是當(dāng)需要使用所關(guān)聯(lián)集合的數(shù)據(jù)時(shí),另外單獨(dú)發(fā)送一條select語(yǔ)句抓取當(dāng)前對(duì)象的關(guān)聯(lián)集合,即延遲加載。

join:在同一條select語(yǔ)句使用連接來(lái)獲得對(duì)方的關(guān)聯(lián)集合。此時(shí)關(guān)聯(lián)集合上的lazy會(huì)失效。

subselect:另外發(fā)送一條查詢語(yǔ)句(或子查詢語(yǔ)句)抓取在前面查詢到的所有實(shí)體對(duì)象的關(guān)聯(lián)集合。這個(gè)策略對(duì)HQL的查詢也起作用。當(dāng)fetch為join時(shí),執(zhí)行左外連接,這個(gè)時(shí)候,在加載Customer時(shí),Customer所對(duì)應(yīng)的Order值全部被加載到緩存中,如果Order中沒(méi)有大數(shù)據(jù),這個(gè)策略是一個(gè)不錯(cuò)的選擇。當(dāng)fetch為subselect時(shí),針對(duì)in有效,如果為select時(shí),from Customer where id in(1,2,3),hibernate會(huì)把ID取出來(lái),逐一的去取Order的值,效率比較低。這個(gè)時(shí)候subselect效率比較高,不管in里含有多少數(shù)據(jù),在查詢Order是,只會(huì)發(fā)出一條sql語(yǔ)句。

把<set>集合中batch-size設(shè)置為一個(gè)比較合適的數(shù)值時(shí)也相當(dāng)于fetch為subselect你可以根據(jù)項(xiàng)目的因素來(lái)選擇發(fā)出sql語(yǔ)句的次數(shù)。HQL總是忽略映射文件中設(shè)置的預(yù)先抓取策略,即在HQL中使用預(yù)先抓取時(shí),必須顯示指明fetch關(guān)鍵字。然而不同的是,QBC則不會(huì)忽略映射文件中的預(yù)先抓取策略。

在實(shí)踐開(kāi)發(fā)項(xiàng)目過(guò)程中,不僅需要根據(jù)實(shí)際情況選擇合適的抓取策略,而且需要通過(guò)不斷的測(cè)試來(lái)驗(yàn)證這個(gè)策略是不是最有效率的。

關(guān)聯(lián)級(jí)別檢索策略

3.? 案例分析

映射文件:

<set name="ord" table="orders" lazy="false" batch-size="2">

????????? <key column="cid"/>

????????? <one-to-many class="Orders"/>?

??????? </set>

測(cè)試:

?? //如果不設(shè)置fetch="join";默認(rèn)的是fetch="select",就是會(huì)出現(xiàn)兩條sql語(yǔ)句,設(shè)置了抓取會(huì)先抓取到所以相關(guān)聯(lián)的數(shù)據(jù),用的時(shí)候直接用,不再?gòu)臄?shù)據(jù)庫(kù)中獲取

?? @Test

?? publicvoid testFetch(){

?????

????? Session session = HibernateUtil.getSession();

????? Customer cus = (Customer) session.get(Customer.class,3);

?????

????? //下面的語(yǔ)句也會(huì)在sql語(yǔ)句后一下輸出

????? System.out.println(cus.getCname());

?????

????? Set<Orders> orders =? cus.getOrd();

????? System.err.println(orders.size());

?????

????? HibernateUtil.close();

?? }

?

?? //測(cè)試fetch="subselect" batch-size="2";兩者任選其一

?? @Test

?? publicvoid testSubselect(){

?????

????? Session session = HibernateUtil.getSession();

????? List<Customer> cus = session.createQuery("from Customer c where c.id in(1,2,3)").list();

????? for(Customer c : cus){?????

??????? System.err.println(c.getCname());

????? }

?????

????? HibernateUtil.close();

?? }

映射文件:

<many-to-one name="cus" column="cid" lazy="false" fetch="join"/>

測(cè)試:

@Test

?? publicvoid testHQL(){

?????

????? Session session = HibernateUtil.getSession();

????? List<Orders> ord = session.createQuery("from Orders").list();

?????

????? HibernateUtil.close();

?? }

轉(zhuǎn)載于:https://www.cnblogs.com/yangkai-cn/archive/2013/01/03/4016991.html

總結(jié)

以上是生活随笔為你收集整理的心得14-hibernate的优化2-抓取(fetch)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。