一、问题描述
由于事务管理在service层,开启事务及关闭事务都在service层。而Hibernate的延迟加载,会在对象真正使用的时候才会向数据发送SQL语句操作数据库。但是可能我们在Service层中并没有真正使用需要操作的对象,而是在Web层真正使用对象。由于在Web层Session已经关闭了,所以会报一个no session的错误,也就是延迟加载的问题。
二、问题解决
在web.xml中配置openSessionInView过滤器(在web层开启关闭session)
注意:openSessionInViewFilter一定要在Struts2的核心配置(拦截器)前进行配置
<!-- OpenSessionInViewFilter解决延迟加载问题 -->
<filter>
<filter-name>openSessionInView</filter-name>
<filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>openSessionInView</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>