Hibernate之懒加载

来源:互联网 发布:cf卡数据恢复软件 编辑:程序博客网 时间:2024/05/19 12:27

一,懒加载

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语句了,数据已经封装到了对象中了.

// 获得sessionorg.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方法:默认使用懒加载,只有当用到数据的时候才会向数据库查询.



0 0
原创粉丝点击