Spring OpenSessionInViewInterceptor不起作用

got*_*ch4 5 spring hibernate lazy-loading

当渲染视图时,我遇到了(in)着名的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
Run Code Online (Sandbox Code Playgroud)

我正在使用简单的基于注释的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>
Run Code Online (Sandbox Code Playgroud)

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

Rob*_*ond 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>
Run Code Online (Sandbox Code Playgroud)

假设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"
Run Code Online (Sandbox Code Playgroud)