Deklarative Transaktionen (@Transactional) funktionieren im Frühjahr nicht mit @Repository

8

Ich versuche eine einfache Anwendung mit Spring, JPA und eingebetteter H2-Datenbank zu machen. Vor kurzem bin ich auf dieses seltsame Problem mit deklarativen Transaktionen gestoßen. Sie machen es einfach nicht, wenn ich mein DAO mit @Repository-Annotation autowire. Genauer gesagt erhalte ich eine Ausnahme beim Flush:

%Vor%

Hier ist mein Setup:

persistence.xml

%Vor%

Entität

%Vor%

DAO

%Vor%

database.xml (im Wurzelkontext enthalten)

%Vor%

Controller

%Vor%

Und jetzt der interessante Teil. Wenn ich @Repository-Annotationen aus DAO entferne und explizit in der Datei database.xml angeben, funktioniert alles einwandfrei.

Aktualisieren

Durch das Einfügen eines weiteren <tx:annotation-driven /> in spring servlet config wird das Problem behoben, aber warum?

    
SpyBot 29.01.2012, 07:46
quelle

3 Antworten

5
___ qstnhdr ___ Deklarative Transaktionen (@Transactional) funktionieren im Frühjahr nicht mit @Repository ___ tag123java ___ Java (nicht zu verwechseln mit JavaScript oder JScript oder JS) ist eine universelle objektorientierte Programmiersprache, die für die Verwendung in Verbindung mit der Java Virtual Machine (JVM) entwickelt wurde. "Java-Plattform" ist der Name für ein Computersystem, auf dem Tools zum Entwickeln und Ausführen von Java-Programmen installiert sind. Verwenden Sie dieses Tag für Fragen, die sich auf die Java-Programmiersprache oder Java-Plattform-Tools beziehen. ___ tag123spring ___ Das Spring Framework ist ein Open-Source-Framework für die Anwendungsentwicklung auf der Java-Plattform. Im Mittelpunkt steht die umfassende Unterstützung von komponentenbasierten Architekturen, und es verfügt derzeit über ein Dutzend hochintegrierter Module. ___ answer9052797 ___

Die Annotation " component-scan " kann vor einer Schnittstellendefinition, einer Methode für eine Schnittstelle, einer Klassendefinition oder einer öffentlichen Methode für eine Klasse platziert werden. Beachten Sie jedoch, dass das bloße Vorhandensein der Annotation spring-servlet.xml nicht ausreicht, um das Transaktionsverhalten tatsächlich zu aktivieren. Die Annotation tx:annotation-driven ist einfach eine Metadaten, die von etwas konsumiert werden kann, das base-package -aware verwendet die Metadaten zum Konfigurieren der entsprechenden Beans mit Transaktionsverhalten. Im Fall des obigen Beispiels ist es das Vorhandensein des Elements <context:include-filter> , das das Transaktionsverhalten einschaltet.

aus dem Frühling doc Ссылка

    
___ tag123transactional ___ Eine Transaktion ist eine Sammlung von Operationen, die auf einer Datenbank ausgeführt werden und in einer Einheit ausgeführt werden sollen. ___ qstntxt ___

Ich versuche eine einfache Anwendung mit Spring, JPA und eingebetteter H2-Datenbank zu machen. Vor kurzem bin ich auf dieses seltsame Problem mit deklarativen Transaktionen gestoßen. Sie machen es einfach nicht, wenn ich mein DAO mit @Repository-Annotation autowire. Genauer gesagt erhalte ich eine Ausnahme beim Flush:

%Vor%

Hier ist mein Setup:

persistence.xml

%Vor%

Entität

%Vor%

DAO

%Vor%

database.xml (im Wurzelkontext enthalten)

%Vor%

Controller

%Vor%

Und jetzt der interessante Teil. Wenn ich @Repository-Annotationen aus DAO entferne und explizit in der Datei database.xml angeben, funktioniert alles einwandfrei.

Aktualisieren

Durch das Einfügen eines weiteren spring-servlet.xml in spring servlet config wird das Problem behoben, aber warum?

    
___ answer 10869450 ___

Wahrscheinlich, weil die @Controller in Ihrer %code% auch Ihre DAO-Klassen in ihre Überprüfung miteinbezieht und daher Instanzen für sie im Anwendungskontext (nicht die "Datenbank") erstellt, ... wenn Ihr Web darauf zugreift Diese DAOs von Web-Controllern greifen auf nicht-transaktionale Versionen von ihnen zu (es sei denn, Sie fügen das %code% -Tag hinzu).

Daher ist das Hinzufügen dieses Tags in der Tat eine schlechte Lösung, da Ihre DAO-Instanzen immer noch im falschen Anwendungskontext erstellt werden: Erstellen Sie besser eine spezifischere %code% -Konfiguration für die Erstellung Ihrer Webschicht-Komponente.

Ich hatte das gleiche Problem, weil ich dachte, ein %code% in meinem %code% kümmere mich nur darum, %code% classes zu scannen ... aber nein: - (

    
___ answer9052840 ___

Nur eine Vermutung, aber Sie müssen nicht Ihr eigenes %code% registrieren, da %code% sich automatisch registriert. Es ist möglich, dass die beiden sich gegenseitig stören.

Wie ich schon sagte, nur eine Ahnung.

    
___ tag123repository ___ Kann sich auf den Datenspeicher eines Versionskontrollsystems beziehen, das den gesamten Verlauf eines Projekts enthält, oder auf ein Objekt, das Daten zwischen der Business-Schicht einer Anwendung und ihrem Datenspeicher überträgt. ___
Daniel Fernández 03.06.2012, 10:11
quelle
0

Nur eine Vermutung, aber Sie müssen nicht Ihr eigenes PersistenceAnnotationBeanPostProcessor registrieren, da <context:component-scan> sich automatisch registriert. Es ist möglich, dass die beiden sich gegenseitig stören.

Wie ich schon sagte, nur eine Ahnung.

    
skaffman 29.01.2012 11:31
quelle
0

Die Annotation " @Transactional " kann vor einer Schnittstellendefinition, einer Methode für eine Schnittstelle, einer Klassendefinition oder einer öffentlichen Methode für eine Klasse platziert werden. Beachten Sie jedoch, dass das bloße Vorhandensein der Annotation @Transactional nicht ausreicht, um das Transaktionsverhalten tatsächlich zu aktivieren. Die Annotation @Transactional ist einfach eine Metadaten, die von etwas konsumiert werden kann, das @Transactional -aware verwendet die Metadaten zum Konfigurieren der entsprechenden Beans mit Transaktionsverhalten. Im Fall des obigen Beispiels ist es das Vorhandensein des Elements <tx:annotation-driven/> , das das Transaktionsverhalten einschaltet.

aus dem Frühling doc Ссылка

    
Ramesh Kotha 29.01.2012 11:23
quelle