一、延迟加载及作用?
延迟加载又叫懒加载。是指在访问数据时,当数据用到的时候才被加载,没有被用到的时候不加载。
二、这样做有什么好处呢?
好处就是每次访问数据的时候,因为只加载需要的数据,这样就可以降低数据库以及内存压力。
虽然说有时候整体的数据量并不多,但是这是一种机制,当数据量比较大的时候,对整体项目或者
方法调用的优化就会有明显的效果。
三、hibernate中get方法和load方法区别?
1、hibernate中,对于get方法,是立即加载的,也就是会立刻从数据库中查询出数据,有数据就直接返回这个
数据,如果没有对应的数据就会返回null;
而hibernate对于load方法,并不是立即去加载的,hibernate会认为要查询的数据一定存在,所以会通过CGLIB生成一个代理对象,
当在使用到该对象的属性的时候才会去查询数据库,但是此时如果数据库中不存在该对象,就会抛出异常:
ERROR LazyInitializer:63 - Exception initializing proxy(还有一种情况会出现此异常:当session关闭之后再调用该对象中的属性 时, 一般这种情况发生在view层调用该对象的属性,因为此时session已经是关闭的了的)。
所以在使用load方法抛出异常并不是因为创建对象引起的,而是因为
调用了该对象中的属性引起的。
2、查询时涉及缓存:
对于get方法,hibernate会先查询一级缓存session,然后查询二级缓存,如果还没有的话就会去查询数据库,如果数据库
中还有就返回null;
对于load方法,hibernate会先查询一级缓存session,没有的话,就会创建代理对象,当使用实际数据时才会去查询二级
缓存和数据库。
四、解决延迟初始化错误的方法:
产生错误的原因:
延迟初始化错误是运用Hibernate开发项目时最常见的错误。如果对一个类或者集合配置了延迟检索策略,
那么必须当代理类实例或代理集合处于持久化状态(即处于Session范围内)时,才能初始化它。
如果在游离状态时才初始化它,就会产生延迟初始化错误。
解决方法:
1、不去将延迟加载对象进行初始化。
如果是一个对象中的属性可以将其忽略初始化:
配置:在该属性的set方法上添加注解:@JSON(serialize=false)
2、将延迟加载的属性在配置中配置为立即加载:lazy=false,lazy属性默认是true;
3、在业务层session关闭之前,对延迟对象初始化。
4、OpeanSessionView配置 :OpenSessionInViewFilter,可将session开启到表现层。
配置如下:
<!-- OpenSessionInViewFilter必须配置在Struts2 Filter之前 -->
<filter>
<filter-name>OpenSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>OpenSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
本文转自 兴趣e族 51CTO博客,原文链接:http://blog.51cto.com/simplelife/1695693