Spring OpenSessionInViewInterceptor不起作用

时间:2011-02-14 13:36:37

标签: hibernate spring lazy-loading

我在渲染视图时遇到了hibernate和延迟加载的着名问题....正如许多人所说,只有两个解决方案是:

  • 使方法具有事务性(并且这并不总是令人沮丧)
  • 使用OpenSessionInViewInterceptor。

后者是优选的IMO。无论如何我不确定这个拦截器是否正在触发(事实上我得到了相同的延迟加载异常并且没有任何变化):

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: it.jsoftware.jacciseweb.beans.Listino.prodotti, no session or session was closed

我正在使用简单的基于注释的url映射,所以阅读Spring 3的文档,我在servlet-context.xml中使用它:

<bean id="handlerMapping"
        class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
        <!-- <property name="order" value="2" /> -->
        <property name="interceptors">
            <list>
                <ref bean="openSessionInViewInterceptorInst" />
            </list>
        </property>
    </bean>

哪个应该成功。但它没有用,我得到了例外。我如何确保我的拦截器正在射击?我该如何解决这个问题?

3 个答案:

答案 0 :(得分:15)

您使用的是@RequestMapping注释吗?如果我没记错,将拦截器放在url bean上是一个问题。使用Spring 3.0,您可以像这样定义拦截器:

<mvc:interceptors>
    <bean class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
        <property name="sessionFactory">
            <ref local="sessionFactory" />
        </property>
    </bean>
</mvc:interceptors>

假设sessionFactory是对SessionFactory bean的引用。

您还需要包含mvc名称空间。

xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"

答案 1 :(得分:4)

尝试使用<mvc:interceptors>

顺便说一句,@Transactional是另一回事 - 它不会使你的收藏品在“视图”中运作。它只是为带注释的方法(以及它调用的方法)打开一个事务(和一个会话)

答案 2 :(得分:0)

如果您在Spring和Hibernate中使用Struts2,请尝试使用OpenSesisonInViewFilter并在web.xml中分配