Hibernate延遲加載
1. 延遲加載先獲取到代理對象,當真正使用到該對象中的屬性的時候,纔會發送SQL語句,是Hibernate框架提高性能的方式
2. 類級別的延遲加載
* Session對象的load方法默認就是延遲加載
* Customer c = session.load(Customer.class, 1L);沒有發送SQL語句,當使用該對象的屬性時,才發送SQL語句
* 使類級別的延遲加載失效
* 在<class>標籤上配置lazy=」false」
* Hibernate.initialize(Object proxy);
3. 關聯級別的延遲加載(查詢某個客戶,當查看該客戶下的全部聯繫人是是不是延遲加載)
* 默認是延遲加載
session
Session session = HibernateUtils.getCurrentSession(); Transaction tr = session.beginTransaction(); Customer c = session.get(Customer.class, 1L); System.out.println("============="); System.out.println(c.getLinkmans().size()); tr.commit();
技術分析之Hibernate框架的查詢策略
1. 查詢策略:使用Hibernate查詢一個對象的時候,查詢其關聯對象.應該如何查詢.是Hibernate的一種優化手段!!! 框架
2. Hibernate框架的檢索策略解決的問題
* 查詢的時機性能
Customer c1 = (Customer) session.get(Customer.class, 1); System.out.println(c1.getLinkmans().size());
* lazy屬性解決查詢的時機的問題,須要配置是否採用延遲加載!!
* 查詢的語句形式
測試
List<Customer> list = session.createQuery("from Customer").list(); for(Customer c : list){ System.out.println(c.getLinkmans()); }
* fetch屬性就能夠解決查詢語句的形式的問題!!
技術分析之在set標籤上配置策略
1. 在<set>標籤上使用fetch和lazy屬性
* fetch的取值 -- 控制SQL語句生成的格式
* select -- 默認值.發送查詢語句
* join -- 鏈接查詢.發送的是一條迫切左外鏈接!!!配置了join.lazy就失效了
* subselect -- 子查詢.發送一條子查詢查詢其關聯對象.(須要使用list()方法進行測試)
* lazy的取值 -- 查找關聯對象的時候是否採用延遲!
* true -- 默認.延遲
* false -- 不延遲
* extra -- 及其懶惰
2. set標籤上的默認值是fetch="select"和lazy="true"
3. 總結:Hibernate框架都採用了默認值,開發中基本上使用的都是默認值。特殊的狀況。
技術分析之在man-to-one標籤上配置策略
1. 在<many-to-one>標籤上使用fetch和lazy屬性
* fetch的取值 -- 控制SQL的格式.
* select -- 默認。發送基本select語句查詢
* join -- 發送迫切左外鏈接查詢
* lazy的取值 -- 控制加載關聯對象是否採用延遲.
* false -- 不採用延遲加載.
* proxy -- 默認值.代理.如今是否採用延遲.
* 由另外一端的<class>上的lazy肯定.若是這端的class上的lazy=」true」.proxy的值就是true(延遲加載).
* 若是class上lazy=」false」.proxy的值就是false(不採用延遲.)
2. 在<many-to-one>標籤上的默認值是fetch="select"和proxy
fetch