我有一个使用Spring和Hibernate的JSF 2.1应用程序。
为了解决懒惰加载问题,我使用OpenSessionInView过滤器。
<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>
一切正常,我的懒惰类被启动,但当我使用导航规则与重定向
<navigation-rule>
<from-view-id>/index.xhtml</from-view-id>
<navigation-case>
<from-outcome>fail</from-outcome>
<to-view-id>/index.xhtml</to-view-id>
<redirect />
</navigation-case>
</navigation-rule>
我得到org.hibernate.LazyInitializationException:
id我删除<redirect />
标签一切工作正常。
为什么?是因为新视图已经创建了吗?那么为什么我要有新的Hibernate会话呢?还有别的办法吗?
<redirect />
是通过向浏览器返回301(或303)响应代码来实现的,因此完成当前请求并关闭当前(Hibernate)会话。
浏览器然后向提供的URL提交一个新的请求,导致一个全新的(Hibernate)会话,您尚未初始化的实体不会绑定到该会话。
你需要在重定向之前手动触发现有请求的初始化(如果可能的话),或者在重定向之后重新获取所有必要的实体。