隨筆 - 6  文章 - 129  trackbacks - 0
          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿(14)

          隨筆檔案(6)

          文章分類(467)

          文章檔案(423)

          相冊(cè)

          收藏夾(18)

          JAVA

          搜索

          •  

          積分與排名

          • 積分 - 827240
          • 排名 - 49

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          Hibernate 提供了 3 種檢索策略:

          l        延遲檢索;

          l        立即檢索;

          l        迫切左外連接;

          Hibernate 提供 2 種方式來(lái)確定檢索策略,一中是在配置文件當(dāng)中,另外一種是在程序種設(shè)置。當(dāng)然,如果你在程序中設(shè)置了檢索策略,那么你在配置文件中的設(shè)置也就無(wú)效了。另外的一種情況是 HQL 會(huì)忽略配置文件的設(shè)置,而總是采用迫切左外連接。

          一、 類級(jí)別的檢索

          可以選擇的檢索策略是立即檢索和延遲檢索,默認(rèn)的是立即檢索。用配置文件中的 <class> 節(jié)點(diǎn)的 lazy 來(lái)控制。

          注意:不管你在配置 class lazy true 還是 false ,對(duì) get() create Criteria () 方法都不起作用,只有對(duì) load() 方法起作用。

          當(dāng)你使用的檢索策略是 lazy 的時(shí)候,當(dāng)你執(zhí)行

          Customer customer = (Customer)session.load(Customer.class,new Long(1));

          的時(shí)候, Hibernate 不從數(shù)據(jù)庫(kù)檢索數(shù)據(jù),而只是產(chǎn)生一個(gè)代理類,只有當(dāng)你執(zhí)行

          Customer.getName();

          的時(shí)候, Hibernate 才到數(shù)據(jù)庫(kù)取數(shù)據(jù)。所以,如下的代碼是會(huì)被拋出異常的:

          Session session  =  sessionFactory.openSession();
          transaction tx 
          =   null ;
          tx 
          =  session.beginTransaction();
            Customer customer 
          =  (Customer)session.load(Customer. class , new  Long( 1 ));
          tx.commit();
            session.close();
          customer.getName();

          get() 方法總是用的立即檢索,如果和它相關(guān)聯(lián)的類也是用的立即檢索,那么也會(huì)把相關(guān)聯(lián)的數(shù)據(jù)也檢索出來(lái)。

          二、 一對(duì)和多對(duì)多關(guān)聯(lián)檢索

          一般地,為了有減少對(duì)數(shù)據(jù)庫(kù)的訪問(wèn),我們往往用延遲檢索的策略。所以,我們優(yōu)先使用如下方式;

          <set class=”order” inverse=”true’ lazy=”true” >

          但是,我們?cè)跈z索“多”的一方的時(shí)候, Hibernate 不能為我們產(chǎn)生代理類。由此,我們就要用 betch-size 的配置來(lái)減少 SQL 語(yǔ)句。

          當(dāng)我們使用 outer-join 屬性的時(shí)候,我們就沒(méi)有必要使用 lazy 屬性了。 Outer-join 會(huì)一次將“一”方和與之相關(guān)的“多”方用左外連接的方式檢索出來(lái)。

          Session session = sessionFactory.openSession();

                               Transaction tx = null;

                               tx = session.beginTransaction();

                              Customer customer = (Customer)session.get(Customer.class,new Long(1));

          產(chǎn)生的 SQL 語(yǔ)句如下:

          Hibernate: select customer0_.ID as ID1_, customer0_.NAME as NAME2_1_, orders1_.CUSTOMER_ID as CUSTOMER3_3_, orders1_.ID as ID3_, orders1_.ID as ID0_, orders1_.ORDER_NUMBER as ORDER2_1_0_, orders1_.CUSTOMER_ID as CUSTOMER3_1_0_ from sampledb.customers customer0_ left outer join sampledb.orders orders1_ on customer0_.ID=orders1_.CUSTOMER_ID where customer0_.ID=?



          posted on 2007-09-16 14:48 Ke 閱讀(724) 評(píng)論(0)  編輯  收藏 所屬分類: hibernate
          主站蜘蛛池模板: 大悟县| 三都| 万载县| 萨嘎县| 屏边| 年辖:市辖区| 浪卡子县| 稷山县| 都江堰市| 依兰县| 睢宁县| 延川县| 兴文县| 神木县| 吴旗县| 简阳市| 赤壁市| 莱州市| 夏津县| 卢湾区| 阿拉尔市| 峨眉山市| 九江县| 且末县| 桃源县| 南投县| 江门市| 准格尔旗| 固安县| 婺源县| 黄陵县| 黑龙江省| 楚雄市| 鹿泉市| 西峡县| 清原| 密云县| 抚远县| 四平市| 汕尾市| 达孜县|