面朝大海,春暖花開

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            12 Posts :: 1 Stories :: 3 Comments :: 0 Trackbacks

          Hibernate 提供了 3 種檢索策略:

          l??????? 延遲檢索;

          l??????? 立即檢索;

          l??????? 迫切左外連接;

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

          一、 類級別的檢索

          可以選擇的檢索策略是立即檢索和延遲檢索,默認的是立即檢索。用配置文件中的 <class> 節點的 lazy 來控制。

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

          當你使用的檢索策略是 lazy 的時候,當你執行

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

          的時候, Hibernate 不從數據庫檢索數據,而只是產生一個代理類,只有當你執行

          Customer.getName();

          的時候, Hibernate 才到數據庫取數據。所以,如下的代碼是會被拋出異常的:

          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() 方法總是用的立即檢索,如果和它相關聯的類也是用的立即檢索,那么也會把相關聯的數據也檢索出來。

          二、 一對和多對多關聯檢索

          一般地,為了有減少對數據庫的訪問,我們往往用延遲檢索的策略。所以,我們優先使用如下方式;

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

          但是,我們在檢索“多”的一方的時候, Hibernate 不能為我們產生代理類。由此,我們就要用 betch-size 的配置來減少 SQL 語句。

          當我們使用 outer-join 屬性的時候,我們就沒有必要使用 lazy 屬性了。 Outer-join 會一次將“一”方和與之相關的“多”方用左外連接的方式檢索出來。

          Session session = sessionFactory.openSession();

          ????????????? ?????? Transaction tx = null;

          ????????????? ????? ?tx = session.beginTransaction();

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

          產生的 SQL 語句如下:

          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 2006-04-10 20:44 面朝大海 閱讀(276) 評論(0)  編輯  收藏 所屬分類: J2EE

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 大港区| 同德县| 临高县| 紫阳县| 宜君县| 九江市| 陇南市| 共和县| 巴彦淖尔市| 呈贡县| 虹口区| 临沭县| 凌云县| 富锦市| 邹城市| 苍梧县| 临朐县| 凤阳县| 衡山县| 叙永县| 广河县| 洪江市| 于都县| 基隆市| 贵阳市| 寿光市| 凉山| 铜梁县| 商城县| 化德县| 綦江县| 托克逊县| 湖北省| 梁平县| 昭通市| 双柏县| 米脂县| 南郑县| 镇巴县| 芒康县| 萨迦县|