以 customer-order为例
一.类级别的检索策略
customer.hbm.xml
<class name="Customer" table="CUSTOMERS" lazy="true">
注意:
1.lazy=false:立即检索,lazy=true:延时检索 默认true
2.lazy属性只对 load 方法有效,对 get,HQL,QBC 均无效。
二.一对多,多对多的检索策略(set 的属性)
customer.hbm.xml
<set name="orders" table="ORDERS"
inverse="true" order-by="ORDER_NAME DESC"
lazy="true"
batch-size="2"
fetch="subselect">
<key column="CUSTOMER_ID"></key>
<one-to-many class="Order"/>
</set>
1.lazy属性
(1)1-n,n-n的集合属性默认使用懒加载
(2)可以通过修改set的lazy属性来修改默认的检索策略,默认为true,并不建议设置为false
(3)lazy还可以设置为extra。增强的延时检索,该取值会尽可能的延迟初始化的时机
lazy设置为true时,应用程序第一次访问集合属性:iterator(),size(),isEmpty(),contains()等方法,会初始化集合的代理类对象。
lazy设置为extra时,
当程序第一次访问 orders属性的iterator()方法时,会导致orders集合代理类实例的初始化,
2.batch-size 批量初始化
set元素的batch-size属性:设定一次初始化set集合的数量。
List<Customer> customers = session.createQuery("FROM Customer").list();
System.out.println(customers.size());
for(Customer customer: customers){
if(customer.getOrders() != null)
System.out.println(customer.getOrders().size());
}
由于customer.hbm.xml 的 set 中设置了batch-size="2" ,所以查询Customer 的 Orders时,一次将初始化两个set元素
3.fetch属性 决定初始化orders集合的方式
3.1.默认值为select。通过正常的方式来初始化set元素
3.2.可以取值 subselect。 通过子查询的方式来初始化所有的set集合作为where字句的in的条件出现,子查询所有1的一端的ID,此时lazy有效。但batch-size失效
3.3.若取值为join,则
3.3.1 在加载1的一端的对象时,使用迫切左外连接(使用左外连接,且把集合进行初始化)的方式把set进行初始化
3.3.2 忽略lazy属性
3.3.3 HQL查询忽略fetch=join取值
三.多对一,一对一关联检索策略
order.hbm.xml
<many-to-one
name="customer" class="Customer"
column="CUSTOMER_ID"
lazy="false"
fetch="join"></many-to-one>
1.lazy属性
lazy取值为proxy和false分别代表对应的属性采用延迟检索和立即检索
2.fetch属性
fetch取值为join表示使用迫切左外连接的方式初始化n关联的1的一端的属性,并 忽略lazy属性
3.batch-size
该属性需要设置在1的一端的class元素中:
customer.hbm.xml
<class name="Customer" table="CUSTOMERS" lazy="true" batch-size="5">
作用:一次初始化1的这一端代理对象的个数