hibernate教程--抓取策略
Hibernate的抓取策略
1.1、 區(qū)分延遲和立即檢索:
立即檢索:
* 當執(zhí)行某行代碼的時候,馬上發(fā)出SQL語句進行查詢.
* get()
延遲檢索:
* 當執(zhí)行某行代碼的時候,不會馬上發(fā)出SQL語句進行查詢.當真正使用這個對象的時候才會發(fā)送SQL語句.
* load();
1.2、類級別檢索和關(guān)聯(lián)級別檢索:
類級別的檢索:
* <class>標簽上配置lazy
關(guān)聯(lián)級別的檢索:
* <set>/<many-to-one>上面的lazy.
1.2.1、從一的一方關(guān)聯(lián)多的一方:
* <set>
* fetch:控制sql語句的類型
* join:發(fā)送迫切左外連接的SQL查詢關(guān)聯(lián)對象.fetch=”join”那么lazy被忽略了.
* select:默認值,發(fā)送多條SQL查詢關(guān)聯(lián)對象.
* subselect:發(fā)送子查詢查詢關(guān)聯(lián)對象.(需要使用Query接口測試)
* lazy:控制關(guān)聯(lián)對象的檢索是否采用延遲.
* true:默認值, 查詢關(guān)聯(lián)對象的時候使用延遲檢索
* false:查詢關(guān)聯(lián)對象的時候不使用延遲檢索.
* extra:及其懶惰.
如果fetch是join的情況,lazy屬性將會忽略.
1.2.2、在多的一方關(guān)聯(lián)一的一方:
* <many-to-one>
* fetch:控制SQL語句發(fā)送格式
* join:發(fā)送一個迫切左外連接查詢關(guān)聯(lián)對象.fetch=”join”,lay屬性會被忽略.
* select:發(fā)送多條SQL檢索關(guān)聯(lián)對象.
* lazy:關(guān)聯(lián)對象檢索的時候,是否采用延遲
* false:不延遲
* proxy:使用代理.檢索訂單額時候,是否馬上檢索客戶 由Customer對象的映射文件中<class>上lazy屬性來決定.
* no-proxy:不使用代理
測試:
package com.sihai.hibernate3.test;import java.util.List;import org.hibernate.Hibernate; import org.hibernate.Session; import org.hibernate.Transaction; import org.junit.Test;import com.sihai.hibernate3.demo1.Customer; import com.sihai.hibernate3.demo1.Order; import com.sihai.utils.HibernateUtils;/*** Hibernate的抓取策略* * @author sihai* */ public class HibernateTest4 {@SuppressWarnings("unchecked")@Test// 批量抓取:// 從訂單批量抓取客戶// 在Customer.hbm.xml中<class>標簽上設(shè)置batch-size=""public void demo9(){Session session = HibernateUtils.openSession();Transaction tx = session.beginTransaction();// 查詢所有的訂單:List<Order> list = session.createQuery("from Order").list();for (Order order : list) {System.out.println(order.getCustomer().getCname());}tx.commit();session.close();}@Test// 批量抓取:// 從客戶批量抓取訂單// <set>標簽上設(shè)置batch-size=""public void demo8(){Session session = HibernateUtils.openSession();Transaction tx = session.beginTransaction();// 查詢所有客戶List<Customer> list = session.createQuery("from Customer").list();for (Customer customer : list) {for (Order order : customer.getOrders()) {System.out.println(order.getAddr());}}tx.commit();session.close();}@Test// 在Order.hbml.xml中<many-to-one>標簽上配置fetch和lazypublic void demo7(){Session session = HibernateUtils.openSession();Transaction tx = session.beginTransaction();/*** fetch="select",lazy="false"*/// 查詢一號訂單//Order order = (Order) session.get(Order.class, 1);// 發(fā)送多條SQL查詢關(guān)聯(lián)對象// 查詢一號訂單所屬客戶的名稱://System.out.println("客戶名稱:"+order.getCustomer().getCname());// 不發(fā)送SQL/*** fetch="select",lazy="proxy"* proxy:查詢關(guān)聯(lián)對象的時候,是否采用延遲,由另一端的類級別延遲來決定.* * Customer的<class>上配置的是lazy="true".檢索的時候采用延遲* * Customer的<class>上配置的是lazy="false".檢索的時候不采用延遲*/// 查詢一號訂單Order order = (Order) session.get(Order.class, 1);// 發(fā)送多條SQL查詢關(guān)聯(lián)對象// 查詢一號訂單所屬客戶的名稱:System.out.println("客戶名稱:"+order.getCustomer().getCname());// 不發(fā)送SQLtx.commit();session.close();}@Test// 在Order.hbml.xml中<many-to-one>標簽上配置fetch和lazypublic void demo6(){Session session = HibernateUtils.openSession();Transaction tx = session.beginTransaction();/*** fetch="join",lazy被忽略.*/// 查詢一號訂單Order order = (Order) session.get(Order.class, 1);// 發(fā)送一條迫切左外連接查詢關(guān)聯(lián)對象.// 查詢一號訂單所屬客戶的名稱:System.out.println("客戶名稱:"+order.getCustomer().getCname());tx.commit();session.close();}@SuppressWarnings("unchecked")@Test// 在Customer.hbm.xml的<set>標簽上配置fetch和lazy// fetch="subselect" 子查詢public void demo5(){Session session = HibernateUtils.openSession();Transaction tx = session.beginTransaction();/*** 配置fetch="subselect" lazy="true"*/ // List<Customer> list = session.createQuery("from Customer").list();// 發(fā)送查詢所有客戶的SQL // for (Customer customer : list) { // System.out.println("客戶訂單數(shù)量:"+customer.getOrders().size());// 發(fā)送一個子查詢?nèi)ゲ樵冴P(guān)聯(lián)對象. // }// 使用子查詢 查詢多個的情況./*Customer customer = (Customer) session.get(Customer.class, 1);System.out.println("客戶訂單數(shù)量:"+customer.getOrders().size());*//*** 配置fetch="subselect" lazy="false"*/ // List<Customer> list = session.createQuery("from Customer").list();// 發(fā)送查詢所有客戶的SQL,發(fā)送一個子查詢查詢訂單 // for (Customer customer : list) { // System.out.println("客戶訂單數(shù)量:"+customer.getOrders().size());// 不發(fā)送SQL // }/*** 配置fetch="subselect" lazy="extra"*/List<Customer> list = session.createQuery("from Customer").list();// 發(fā)送查詢所有客戶的SQLfor (Customer customer : list) {System.out.println("客戶訂單數(shù)量:"+customer.getOrders().size());// 只發(fā)送統(tǒng)計客戶訂單數(shù)量的sqlfor (Order order : customer.getOrders()) {System.out.println(order.getAddr());}}tx.commit();session.close();}@Test// 在Customer.hbm.xml的<set>標簽上配置fetch和lazy// fetch="select"public void demo4() {Session session = HibernateUtils.openSession();Transaction tx = session.beginTransaction();/*** 配置fetch="select" lazy="true"* * 發(fā)送多條SQL.默認值就是fetch="select" lazy="true"*/// 查詢一號客戶// Customer customer = (Customer) session.get(Customer.class, 1);//發(fā)送一條查詢客戶的SQL// 查看一號客戶的訂單的數(shù)量:// System.out.println("訂單的數(shù)量:" + customer.getOrders().size());//又發(fā)送一條查詢訂單的SQL/*** 配置fetch="select" lazy="false"*/// 查詢一號客戶//Customer customer = (Customer) session.get(Customer.class, 1);//發(fā)送多條SQL查詢// 查看一號客戶的訂單的數(shù)量://System.out.println("訂單的數(shù)量:" + customer.getOrders().size());//不發(fā)送SQL/*** 配置fetch="select" lazy="extra"* * extra:及其懶惰的.*/// 查詢一號客戶Customer customer = (Customer) session.get(Customer.class, 1);// 發(fā)送一條查詢客戶的SQL// 查看一號客戶的訂單的數(shù)量:System.out.println("訂單的數(shù)量:" + customer.getOrders().size());// 查詢訂單的數(shù)量:select count(oid) from orders o where o.cid = ? for (Order order : customer.getOrders()) {System.out.println(order);}tx.commit();session.close();}@Test// 在Customer.hbm.xml的<set>標簽上配置fetch和lazy// fetch="join",lazy的取值就會被忽略.public void demo3() {Session session = HibernateUtils.openSession();Transaction tx = session.beginTransaction();// 查詢一號客戶Customer customer = (Customer) session.get(Customer.class, 1);// 發(fā)送了一條迫切左外連接的SQL// 查看一號客戶的訂單的數(shù)量:System.out.println("訂單的數(shù)量:" + customer.getOrders().size());// 不發(fā)送SQL.tx.commit();session.close();}@Test// 默認的情況下 沒有配置任何信息// 發(fā)送多條SQL查詢其關(guān)聯(lián)對象.public void demo2() {Session session = HibernateUtils.openSession();Transaction tx = session.beginTransaction();// 查詢一號客戶Customer customer = (Customer) session.get(Customer.class, 1);// 發(fā)送一條查詢客戶的SQL.// 查看一號客戶的訂單的數(shù)量:System.out.println("訂單的數(shù)量:" + customer.getOrders().size());// 使用訂單的時候,又會發(fā)送一條SQL查詢tx.commit();session.close();}@Test// 區(qū)分立即和延遲檢索public void demo1() {Session session = HibernateUtils.openSession();Transaction tx = session.beginTransaction();// 立即檢索// Customer customer = (Customer) session.get(Customer.class, 1);// System.out.println(customer.getCname());// 延遲檢索:Customer customer = (Customer) session.load(Customer.class, 1);Hibernate.initialize(customer);System.out.println(customer.getCname());tx.commit();session.close();} }總結(jié)
以上是生活随笔為你收集整理的hibernate教程--抓取策略的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hibernate教程--检索方式详解(
- 下一篇: hibernate教程--抓取策略详解