Hibernate基本特性之延迟加载机制
Hibernate在使用时,有些API操作是具有延迟加载机制的。
延迟加载机制特点:
当通过Hibernate的API获取一个对象结果后,该对象并没有数据库数据,当通过对象的getter方法获取属性值时才去数据库查询加载。
a.具有延迟加载机制的操作如下:
--session.load 查询
--query.iterator 查询
--获取关联对象的属性信息
*b.常犯错误:
LazyInitalizationException:could not initialize proxy - no Session
--代码中使用了延迟加载操作,但是session在加载数据前关闭了。
c.延迟加载原理
在使用延迟加载操作后,Hibernate返回的对象是Hibernate利用CGLIB技术新生成的一个类型。在新类型中,将属性的 getter方法重写。新生成类是原实体类的子类。
public class Foo$$EnhancerByCGLIB extends Foo{
public String getName(){
//判断是否已加载过数据
//如果加载过,返回name值
//如果未加载,发送SQL查询加载数据,然后返回name值
}
}
*d.session 的get和load方法的区别:
--两者都是按主键作条件查询。
--get是立刻加载;load是延迟加载。
--get返回的对象类型是实体类型;load返回的是动态生成的代理类,该代理类是实体类的子类。
--get未查到数据返回null;load未查到数据抛出ObjectNotFoundException异常。
e.延迟加载机制好处
--提高了内存的使用效率。
--可以降低数据访问并发量。