2010-07-20 6 views
26

Quelle est cette erreur? "Aucune session Hibernate liée à thread, et la configuration ne permet pas la création de non-transactionnel ici". Mon fichier de configuration de printemps ressemble à ceci.Aucune session Hibernate liée au thread, et la configuration n'autorise pas la création de transaction non-transactionnelle ici

<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> 

Toutes les passes de test DAO quand je les tester en dehors du récipient en utilisant JUnit. Lorsque je le déploie dans jBoss en tant qu'application de portail, j'obtiens cette exception. Aussi, cela fonctionne très bien si je supprime la configuration spécifique du portail et en faire une application web simple et le déployer sur jboss.Any idée?

+0

Voir aussi http://stackoverflow.com/questions/734614/spring-hibernate-junit-no-hibernate-session-bound-to-thread – Vadzim

Répondre

35

Vous avez défini un TransactionManager dans votre config print, mais vous essayez d'exécuter une requête d'hibernation dans une méthode qui n'est pas transactionnelle. Essayez d'ajouter @Transactional à votre méthode ou classe.

+1

Il s'agit juste d'une requête de sélection. Dois-je ajouter cette annotation à toutes les méthodes DAO? – chedine

+0

Il peut s'agir de la méthode DAO ou de la méthode de service ou de l'une des classes, mais il doit se situer quelque part dans la pile si vous utilisez un TransactionManager ou vous obtiendrez l'exception que vous avez rencontrée car vous essayez de l'exécuter une requête en dehors d'une transaction. – rjsang

+0

Pourquoi certains travaillent sans cette annotation? – chedine

4

J'ai eu ce problème en spécifiant le current_session_context_class dans hibernate config être « thread », selon la configuration simple indiqué dans le hibernate configuration documentation.

Mais il recommande que ce n'est pas sûr pour une utilisation en production.

Essayer d'ajouter ce qui suit dans votre hibernate config devrait aussi aider:

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

Découvrez http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/architecture.html#architecture-current-session pour plus de détails.

+1

Juste un avertissement à ceux qui essaient cela et qui utilisent Spring: Je viens d'avoir une erreur différente lors de la configuration de 'current_session_context_class'. Dans plusieurs autres questions, cela a donné lieu à des problèmes avec les transactions. Effectivement, cela semble supprimer la gestion des transactions au printemps. (voir par exemple: http://stackoverflow.com/questions/4293098/how-to-integrate-spring-with-hibernate-session-and-transaction-management) – Yashima

+0

J'ai aussi eu un comportement différent. J'ai chargé un objet de la base de données, fait un changement, puis j'ai essayé de le persister. Pour que cela fonctionne, j'ai dû l'expulser de la session puis l'enregistrer. – Zoidberg

Questions connexes