Spring, Hibernate und deklarative Transaktionsimplementierung: Es gibt keine aktive Transaktion

8

Ich versuche, deklarative Transaktion zu machen.

Dies ist meine Datei spring.xml:

%Vor%

Und das ist meine Controller-Implementierung:

%Vor%

Beide sind im Paket Test genannt.

Das ist mein Versuch:

%Vor%

Aber das wirft eine Ausnahme:

  

org.hibernate.HibernateException: createQuery ist ohne aktive Transaktion nicht gültig

Warum transactionManager nicht funktioniert? Ich hoffe mit @Transactional Annotation alle Transaktionen werden von Spring Framework verwaltet werden. Was kann ich tun?

Danke allen.

    
blow 09.11.2010, 21:09
quelle

2 Antworten

20

Entfernen Sie die folgenden Zeilen, sie werden nicht benötigt, wenn Transaktionen von Spring verwaltet werden:

%Vor%

Tatsächlich wird durch die Einstellung von hibernate.current_session_context_class die Spring-Transaktionsverwaltung deaktiviert, siehe AbstractSessionFactoryBean.setExposeTransactionAwareSessionFactory() javadoc :

  

Schalten Sie diese Markierung aus, um die Ebene freizulegen   Hibernate SessionFactory mit   Ruhezustand ist Standard   getCurrentSession () Verhalten,   unterstützende einfache JTA-Synchronisation   nur. Alternativ einfach überschreiben   die entsprechende Hibernate-Eigenschaft   "hibernate.current_session_context_class".

    
axtavt 09.11.2010, 21:39
quelle
1

Ich erinnere mich, dass Sie mit stereotyp-annotierten Klassen wie @Controller ein seltsames Verhalten bekommen können, wenn die Klasse eine solche Schnittstelle implementiert.

Ich bin nicht 100% sicher, was die Problemumgehung dafür ist, aber versuchen Sie eine oder beide der folgenden:

  • Verschiebe @Transactional von TestControllerImp.findAll() nach TestController.findAll()
  • Füge proxy-target-class="true" zu deinem <tx:annotation-driven/> hinzu

Einer oder beide oder die sollten den Trick machen, aber keiner ist ideal. Ich habe das schon früher in anderen Fragen gesehen und bin nie ganz auf den Grund gekommen, was es verursacht.

    
skaffman 09.11.2010 21:19
quelle