Hibernate 检索策略 (lazy,batch-size,fetch属性)

以  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集合代理类实例的初始化

     当程序第一次访问 order 属性的 size(),contains() isEmpty () 方法时 ,Hibernate 不会初始化 orders 集合类的实例 , 仅通过特定的 select 语句查询必要的信息 , 不会检索所有的 Order 对象

    
    lazy = "true" ,lazy="extra"  时,可通过 Hibernate.initialize () 静态方法显式初始化


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的这一端代理对象的个数



猜你喜欢

转载自blog.csdn.net/qq_34763699/article/details/53536666