错误提示:
严重: Servlet.service() for servlet jsp threw exception
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: cn.itcast.oa.domain.User.roles, could not initialize proxy - no Session
at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:584)
at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:201)
查了一下,懒加载异常,就是在查询时没有加载关联表的对象,你读取这个关联对象的时候,hibernate的session已经关闭,所以无法获取对象。
解决方案一: 在映射配置文件中相应位置添加属性: lazy="false"
方案一弊端:
这种方式一次性把所有页面所请求的数据加载并响应,如果请求数据比较大的情况下,页面加载速度肯定大打折扣。
<many-to-one name="department" class="Department" column="departmentId" lazy="false"></many-to-one>
<set name="roles" table="itcast_user_role" lazy="false">
<key column="userId"></key>
<many-to-many class="Role" column="roleId"></many-to-many>
</set>
解决方案二:在web.xml中配置Spring的OpenSessionInViewFilter。
配置OpenSessionInViewFilter过滤器的时候,需要把这个过滤器的配置放在struts2的核心过滤器之前(不然无效)。
原因:https://blog.csdn.net/weixin_41450959/article/details/80698097
方案二的弊端:
参考:https://www.cnblogs.com/blogonfly/articles/3991782.html
首先OpenSessionInViewFilter调用流程:
request(请求)->open session并开始transaction->controller->View(Jsp)->结束transaction并 close session.一切看起来很正确,尤其是在本地开发测试的时候没出现问题,但试想下如果流程中的某一步被阻塞的话,那在这期间connection就一直被占用而不释放。最有可能被阻塞的就是在写Jsp这步,一方面可能是页面内容大,response.write的时间长,另一方面可能是网速慢,服务器与用户间传输时间久。当大量这样的情况出现时,就有连接池连接不足,造成页面假死现象。
<!--配置Spring的OpenSessionInViewFilter, 以解决懒加载问题-->
<filter>
<filter-name>OpenSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>OpenSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>