Hibernate之懒加载

一,懒加载

1)概念:当用到数据 的时候才向数据库查询,这就是hibernate的懒加载特性. 目的:提供程序执行效率!

2,lazy 值

1) true   使用懒加载(默认使用懒加载,即lazy值默认就是true); 

<!--在类上声明-->
<class name="Dept" table="t_dept" lazy="true">
   ...
</class>
<!--在集合属性上声明-->
<set name="emps" cascade="save-update,delete" inverse="false"
            table="t_employee" lazy="false">
            <key column="dept_id"></key>
            <one-to-many class="Employee" />
</set>
2)false   关闭懒加载(实例如上)!
3)extra   (在集合数据懒加载时候提升效率),在真正使用数据的时候才向数据库发送查询的sql;如果调用集合的size()/isEmpty()方法,只是统计,不真正查询数据!这个属性只能在集合属性声明上使用(看工具提醒就知道,类上是不会出现这个属性的)

<!--在集合属性上声明-->
<set name="emps" cascade="save-update,delete" inverse="false"
            table="t_employee" lazy="extra">
            <key column="dept_id"></key>
            <one-to-many class="Employee" />
</set>

三,由懒加载引起的一些问题

1)Session关闭,使用懒加载报错

Hibernate的懒加载特性主要就是为了提高程序的执行效率,但是当我们关闭session后,使用懒加载数据会报错:org.hibernate.LazyInitializationException: could not initialize proxy - no Session,有四种方式解决.

a)先使用一下数据,如:dept.getDeptName().因为我们已经使用过数据即已经执行完相应的SQL语句了,数据已经封装到了对象中了.

// 获得session
		org.hibernate.Session session = sf.openSession();

		session.beginTransaction();
		//get方法:及时查询
//		Dept dept = (Dept) session.get(Dept.class, 1);
//		System.out.println(dept.getDeptId()+","+dept.getDeptName());
				
		/**
		 * load:默认是使用拦截,当要使用数据的时候才向数据库发送查询的sql语句
		 */
		Dept dept=(Dept) session.load(Dept.class, 1);
		System.out.println(dept.getDeptId());//不会查询数据库,本来就知道
		System.out.println("*********");
		//System.out.println(dept.getDeptName());
		//方式一:先使用一下
		//dept.getDeptName();
		session.getTransaction().commit();
		session.close();
		
		System.out.println(dept.getDeptName());
b)强迫代理对象初始化

Hibernate.initialize(dept);
c)关闭懒加载

d)使用完数据后再关闭session,最常用的一种方式!

四,关于懒加载的面试题

1)get方法与load方法的异同?

get方法:及时加载,只要调用了get方法,就立刻查询数据库.

load方法:默认使用懒加载,只有当用到数据的时候才会向数据库查询.



猜你喜欢

转载自blog.csdn.net/bighuan/article/details/71699139