hibernate教程--抓取策略详解
Hibernate的抓取策略
1.1、 區分延遲和立即檢索:
立即檢索:
* 當執行某行代碼的時候,馬上發出SQL語句進行查詢.
* get()
延遲檢索:
* 當執行某行代碼的時候,不會馬上發出SQL語句進行查詢.當真正使用這個對象的時候才會發送SQL語句.
* load();
1.2、類級別檢索和關聯級別檢索:
類級別的檢索:
* <class>標簽上配置lazy
關聯級別的檢索:
* <set>/<many-to-one>上面的lazy.
1.2.1、從一的一方關聯多的一方:
* <set>
* fetch:控制sql語句的類型
* join:發送迫切左外連接的SQL查詢關聯對象.fetch=”join”那么lazy被忽略了.
* select:默認值,發送多條SQL查詢關聯對象.
* subselect:發送子查詢查詢關聯對象.(需要使用Query接口測試)
* lazy:控制關聯對象的檢索是否采用延遲.
* true:默認值, 查詢關聯對象的時候使用延遲檢索
* false:查詢關聯對象的時候不使用延遲檢索.
* extra:及其懶惰.
如果fetch是join的情況,lazy屬性將會忽略.
1.2.2、在多的一方關聯一的一方:
* <many-to-one>
* fetch:控制SQL語句發送格式
* join:發送一個迫切左外連接查詢關聯對象.fetch=”join”,lay屬性會被忽略.
* select:發送多條SQL檢索關聯對象.
* lazy:關聯對象檢索的時候,是否采用延遲
* 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>標簽上設置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>標簽上設置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);// 發送多條SQL查詢關聯對象// 查詢一號訂單所屬客戶的名稱://System.out.println("客戶名稱:"+order.getCustomer().getCname());// 不發送SQL/*** fetch="select",lazy="proxy"* proxy:查詢關聯對象的時候,是否采用延遲,由另一端的類級別延遲來決定.* * Customer的<class>上配置的是lazy="true".檢索的時候采用延遲* * Customer的<class>上配置的是lazy="false".檢索的時候不采用延遲*/// 查詢一號訂單Order order = (Order) session.get(Order.class, 1);// 發送多條SQL查詢關聯對象// 查詢一號訂單所屬客戶的名稱:System.out.println("客戶名稱:"+order.getCustomer().getCname());// 不發送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);// 發送一條迫切左外連接查詢關聯對象.// 查詢一號訂單所屬客戶的名稱: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();// 發送查詢所有客戶的SQL // for (Customer customer : list) { // System.out.println("客戶訂單數量:"+customer.getOrders().size());// 發送一個子查詢去查詢關聯對象. // }// 使用子查詢 查詢多個的情況./*Customer customer = (Customer) session.get(Customer.class, 1);System.out.println("客戶訂單數量:"+customer.getOrders().size());*//*** 配置fetch="subselect" lazy="false"*/ // List<Customer> list = session.createQuery("from Customer").list();// 發送查詢所有客戶的SQL,發送一個子查詢查詢訂單 // for (Customer customer : list) { // System.out.println("客戶訂單數量:"+customer.getOrders().size());// 不發送SQL // }/*** 配置fetch="subselect" lazy="extra"*/List<Customer> list = session.createQuery("from Customer").list();// 發送查詢所有客戶的SQLfor (Customer customer : list) {System.out.println("客戶訂單數量:"+customer.getOrders().size());// 只發送統計客戶訂單數量的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"* * 發送多條SQL.默認值就是fetch="select" lazy="true"*/// 查詢一號客戶// Customer customer = (Customer) session.get(Customer.class, 1);//發送一條查詢客戶的SQL// 查看一號客戶的訂單的數量:// System.out.println("訂單的數量:" + customer.getOrders().size());//又發送一條查詢訂單的SQL/*** 配置fetch="select" lazy="false"*/// 查詢一號客戶//Customer customer = (Customer) session.get(Customer.class, 1);//發送多條SQL查詢// 查看一號客戶的訂單的數量://System.out.println("訂單的數量:" + customer.getOrders().size());//不發送SQL/*** 配置fetch="select" lazy="extra"* * extra:及其懶惰的.*/// 查詢一號客戶Customer customer = (Customer) session.get(Customer.class, 1);// 發送一條查詢客戶的SQL// 查看一號客戶的訂單的數量:System.out.println("訂單的數量:" + customer.getOrders().size());// 查詢訂單的數量: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);// 發送了一條迫切左外連接的SQL// 查看一號客戶的訂單的數量:System.out.println("訂單的數量:" + customer.getOrders().size());// 不發送SQL.tx.commit();session.close();}@Test// 默認的情況下 沒有配置任何信息// 發送多條SQL查詢其關聯對象.public void demo2() {Session session = HibernateUtils.openSession();Transaction tx = session.beginTransaction();// 查詢一號客戶Customer customer = (Customer) session.get(Customer.class, 1);// 發送一條查詢客戶的SQL.// 查看一號客戶的訂單的數量:System.out.println("訂單的數量:" + customer.getOrders().size());// 使用訂單的時候,又會發送一條SQL查詢tx.commit();session.close();}@Test// 區分立即和延遲檢索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();} } 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的hibernate教程--抓取策略详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hibernate教程--抓取策略
- 下一篇: hibernate教程--二级缓存详解