Hibernate延迟加载是项目中非常常用的技术。通过使用Hibernate延迟加载机制可以在加载数据是不必加载全部数据,而是只加载我们需要的那部分,其余部分在需要使用时才从数据库装载,以此来减少数据量提高系统性能。
Hibernate延迟加载大致可以分为两类,一类是延迟属性加载,另一类是延迟关联实体加载。
属性加载
属性加载又可以分为两类,一类是集合属性,一类是非集合属性。
关联加载
关联加载也分两种情况,一种是多对一,另一种是一对一。
今天遇到的问题属于关联加载的,A、B部门属于关联部门,B属于A的子部门,当查询B部门的时候并没有用的A部门的相关属性,所以为了保证性能我们并没有将A部门的信息加载到页面。但是当我们在B部门页面点击”返回上一级“按钮是,需要传入一个A部门的ID,这时候B部门信息已经显示到页面,相关的session已经关闭了,系统会抛出异常,错误信息如下:
解决办法:
(1)将延迟加载属性设置为false
这种方法最简单,但是这样我们就不能用hibernate的延迟加载机制了,也就是说每次加载都有可能加载很多用不到的数据,影响系统性能,这是不推荐的。
(2)在web.xml中配置openSessionInViewFilter这个过滤器,必须将openSessionInViewFilter过滤器配置中Struts2核心过滤器之前。
<!-- 配置Spring的用于解决懒加载问题的过滤器 -->
<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>*.action</url-pattern>
</filter-mapping>
过滤所有的*.action。这种方法,让session关闭延迟在界面层才关闭。这样在界面取数据的时候就不会报错啦。