2011-02-14 11 views
5

tuve la (in) famoso problema de hibernación y la carga diferida cuando se prestan vistas .... Como muchos dicen, las dos únicas soluciones son:primavera OpenSessionInViewInterceptor no funciona

  • hacer que el método transaccional (y esto no siempre es deseable)
  • Use OpenSessionInViewInterceptor.

Lo último es preferible IMO. De todos modos no estoy seguro si esto interceptor está disparando en todo (de hecho, tengo la misma excepción de carga perezosa y nada cambia):

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

estoy usando simples asignaciones de URL basada en anotaciones, por lo que la lectura de los documentos de Spring 3, estoy usando esto en mi 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> 

Lo que debería hacer el truco. Pero no está funcionando y recibo la excepción. ¿Cómo me aseguro de que mi interceptor está disparando? ¿Cómo puedo solucionar esto?

Respuesta

15

¿Está utilizando la anotación @RequestMapping? Si mal no recuerdo, hubo un problema con poner el interceptor en el url bean. Con Spring 3.0 se puede definir el interceptor de la siguiente manera:

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

suponiendo que sessionFactory es una referencia al bean SessionFactory.

También deberá incluir el espacio de nombres 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

Sus obras de encantamiento, gracias. De todos modos, para el futuro, ¿cómo me aseguro de que un interceptor se active y mi configuración sea correcta? De lo contrario, al igual que en estas situaciones, no hay otra manera de saberlo que no sea ver que ya no recibo la excepción. Debe ser una forma de depurar esto o registrarlo. – gotch4

+1

@ gotch4 Si activa el inicio de sesión en org.springframework en DEPURAR, puede verlo en el archivo de registro. –

+0

¿Cómo hago eso con precisión? Lo siento, soy un novato cojo – gotch4

4

Intente utilizar <mvc:interceptors>.

Por cierto, @Transactional es algo diferente, no hace que sus colecciones funcionen en la "vista". Simplemente abre una transacción (y una sesión) para el método anotado (y los métodos que llama)

0

Si está utilizando Struts2 con Spring e Hibernate, Trate de usar OpenSesisonInViewFilter y asignarlo en web.xml

Cuestiones relacionadas