Nicht persistente Entitäten - Spring + Hibernate + JPA

8

Ich verwende Spring + Hibernate + JPA und ich habe eine Situation, in der ich meine Entitäten nicht dazu bringen kann, in der Datenbank zu bleiben. Ich habe eine Serviceklasse eingerichtet, die mit @Transactional gekennzeichnet ist. Es verwendet ein DAO, das einen injizierten EntityManager enthält. Wenn ich die Funktion auf dem Service-Objekt anrufe, sehe ich eine Reihe von Selects für die Lesevorgänge, die das DAO macht, aber keine Updates / Löschungen als Folge von Zusammenführungen und Löschungen, die von meinem DAO ausgegeben werden. Sicher stimmt etwas mit meinem Setup nicht, aber ich kann es nicht sehen.

persistence.xml

%Vor%

config.xml

%Vor%

AccountService.java

%Vor%

BenutzerDAOImpl.java

%Vor%

AccountActivationController.java

%Vor%     
threejeez 26.06.2011, 08:48
quelle

2 Antworten

18

Ok, ich habe das Problem herausgefunden. Ich brauchte ewig um es herauszufinden und hatte nichts mit meiner Datenbankkonfiguration zu tun, also möchte ich Leuten helfen, die ähnliche Probleme haben.

In der Spring-Dokumentation heißt es:

  

<tx:annotation-driven/> sucht nur nach   @Transactional auf Bohnen in der gleichen   Anwendungskontext ist in definiert.   Dies bedeutet, dass, wenn Sie setzen    <tx:annotation-driven/> in a   WebApplicationContext für a   DispatcherServlet, es prüft nur nach   @Transactional Bohnen in Ihrem   Controller und nicht Ihre Dienste.   Siehe Abschnitt 15.2, "Der   DispatcherServlet "für mehr   Informationen.

Was nicht in meinem ursprünglichen Beitrag gepostet wird, ist meine Servlet-Definition, die die folgenden Zeilen des Konfigurationscodes enthält:

myServlet.xml

%Vor%

Damit werden alle annotierten Beans, einschließlich Controller, Services und Repositorys, anstelle des Anwendungskontexts in den Servlet-Kontext eingefügt. Und darin liegt das Problem. Wenn Spring nach Beans sucht, die mit @Transactional versehen sind (aufgrund der Existenz von <tx:annotation-driven/> in meiner Datei config.xml), sucht sie im Anwendungskontext nach diesen Beans. Und basierend auf meiner Konfiguration, die in meinem vorherigen Thread gepostet wurde, werden keine Beans in meinen Anwendungskontext geladen ... sie befinden sich alle im Servlet-Kontext. Daher, wenn mein Servlet die Beans annotiert mit @Service & amp; @Transactional war es mit Beans, die nicht von Transaktionsproxies umhüllt wurden . Also keine Transaktionen. Der Trick (eher der richtige Weg) war, meine Konfigurationsdateien folgendermaßen zu ändern:

myServlet.xml

%Vor%

config.xml

%Vor%

Diese Konfiguration stellt sicher, dass alle Controller im Servletkontext vorhanden sind und Transactional Services und Repositories im Anwendungskontext vorhanden sind, wo sie hingehören . Und schließlich, nach vielen schlaflosen Nächten, bleiben meine Datenbank-Schreibvorgänge bestehen.

    
threejeez 28.06.2011, 18:27
quelle
1

Wir können den Controller in servlet-context.xml wie folgt bereitstellen

%Vor%

Damit wird sichergestellt, dass nur Controller im Servlet-Kontext existiert. Verwenden Sie in root-context.xml Folgendes:

%Vor%

Dadurch wird sichergestellt, dass die anderen Komponenten als Controller im Anwendungskontext vorhanden sind. Ich habe viel nach dieser Lösung gesucht, da ohne diese JPA die Datenbank nicht aktualisiert wurde, hoffe das jemand weiterhilft.

    
ArunKodakan 22.08.2015 04:00
quelle