2010-07-20 15 views
26

¿De qué se trata este error? "Ninguna sesión de Hibernate vinculada al hilo, y la configuración no permite la creación de una no transaccional aquí". Mi archivo de configuración de muelles se ve algo así.Ninguna sesión de Hibernate vinculada al hilo, y la configuración no permite la creación de una no transaccional aquí

<bean id="jndiDataSource" 
    class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiName"> 
     <value>java:/devDS</value> 
    </property> 
</bean> 
<bean id="stsaDBFactory" 
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="dataSource" ref="jndiDataSource" /> 
    <property name="annotatedClasses"> 
     <list> 
      <value>xx.yy.zz.User</value> 
      <value>xx.yy.UserResponse</value> 

     </list> 
    </property> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.show_sql">true</prop> 
      <prop key="hibernate.hbmddl.auto">create</prop> 
     </props> 
    </property> 
</bean> 

<!-- ################################### Aspects ################################################## --> 

<bean id="txManager" 
    class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory"> 
     <ref local="stsaDBFactory" /> 
    </property> 
</bean> 

Todas las pruebas DAO pasan cuando las pruebo fuera del contenedor usando junit. Cuando lo despliego en jBoss como una aplicación de portal, obtengo esta excepción. También funciona bien si elimino la configuración específica del portal y la convierto en una simple aplicación web y la despliego en jboss.¿Cualquier idea?

+0

Véase también http://stackoverflow.com/questions/734614/spring-hibernate-junit-no-hibernate-session-bound-to-thread – Vadzim

Respuesta

35

Ha definido un TransactionManager en su configuración de primavera pero está intentando ejecutar una consulta de hibernación en un método que no es transaccional. Intenta agregar @Transactional a tu método o clase.

+1

Es solo una consulta de selección. ¿Debo agregar esta anotación a todos los métodos DAO? – chedine

+0

Puede estar en el método DAO o en el método de servicio o en cualquiera de las clases, pero tiene que estar en algún lugar de la pila si está utilizando un TransactionManager o obtendrá la excepción que encontró porque está tratando de ejecutar una consulta fuera de una transacción. – rjsang

+0

¿Cómo es que algunos funcionan sin esta anotación? – chedine

4

I tiene alrededor de este problema mediante la especificación de la current_session_context_class en hibernate config ser "thread", como por la sencilla configuración mostrada en la hibernate configuration documentation.

Pero recomienda que no sea seguro para el uso de producción.

Tratar de añadir lo siguiente en su hibernate config también debería ayudar:

<property name="current_session_context_class">org.hibernate.context.ThreadLocalSessionContext</property> 

Salida http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/architecture.html#architecture-current-session para más detalles.

+1

Solo una advertencia para aquellos que prueban esto y están usando Spring: acabo de recibir un error diferente al configurar 'current_session_context_class'. En varias otras preguntas, esto dio lugar a problemas con las transacciones. Efectivamente, esto parece eliminar la gestión de transacciones de primavera. (ver por ejemplo: http://stackoverflow.com/questions/4293098/how-to-integrate-spring-with-hibernate-session-and-transaction-management) – Yashima

+0

También tuve un comportamiento diferente. Cargué un objeto de la base de datos, hice un cambio y luego intenté persistir. Para que funcione, tuve que expulsarlo de la sesión y luego guardarlo. – Zoidberg

Cuestiones relacionadas