JSF中的OpenSessionInViewFilter + Redirect

时间:2011-07-25 16:45:15

标签: hibernate spring jsf jsf-2

我有JSF 2.1应用程序uisng Spring和Hibernate。

为了解决LazyLoading问题我正在使用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 />标记一切正常。

为什么呢?是因为新的View已被创建了吗?那我为什么要有新的Hibernate Session呢? 有什么工作吗?

1 个答案:

答案 0 :(得分:2)

通过向浏览器返回301(或303)响应代码来实现

<redirect />,从而完成当前请求并关闭当前(Hibernate)会话。

然后,

浏览器会向提供的网址提交请求,从而生成尚未初始化的实体未绑定的全新(Hibernate)会话。

您需要在重定向之前手动触发现有请求中的初始化(如果可能),或者在重定向后再次重新获取所有必需的实体。