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:
Und jetzt der interessante Teil. Wenn ich @Repository-Annotationen aus DAO entferne und explizit in der Datei database.xml angeben, funktioniert alles einwandfrei.
Durch das Einfügen eines weiteren <tx:annotation-driven />
in spring servlet config wird das Problem behoben, aber warum?
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 Ссылка
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:
Und jetzt der interessante Teil. Wenn ich @Repository-Annotationen aus DAO entferne und explizit in der Datei database.xml angeben, funktioniert alles einwandfrei.
Durch das Einfügen eines weiteren spring-servlet.xml
in spring servlet config wird das Problem behoben, aber warum?
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: - (
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.
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 Ссылка
Tags und Links java spring repository transactional