Ich versuche, Datensatz in MySql Db zu aktualisieren. Während der Aktualisierung wurde folgende Ausnahme ausgelöst:
%Vor%Ich überprüfe die Sitzung. Es schließt sich im Finally-Block jeder Methode. Nicht in der Lage herauszufinden, was falsch ist. Ich bin in der Lage, Operation ohne andere Probleme mit anderen Methoden einzufügen, aber nur die saveUpdateUserBean-Methode wirft Ausnahme
BenutzerDAOImpl:
%Vor%ServiceImpl:
%Vor%applicationContext.xml:
%Vor%Ich bin in der Lage, alle Datenbankoperationen mit derselben Konfiguration durchzuführen, aber wenn ich die blockuser () -Methode von serviceImpl aufruft, rufen ihre aufrufenden DAO-Methoden und die saveupdateUserBean über die Ausnahme hinaus? m ich vermisse etwas?
Hibernate Handbuch sagt :
Verwenden Sie update (), wenn Sie sicher sind, dass die Sitzung keine enthält Bereits persistente Instanz mit demselben Bezeichner. Verwenden Sie merge () wenn Sie möchten Ihre Änderungen jederzeit ohne Gegenleistung zusammenführen des Zustandes der Sitzung. Mit anderen Worten, update () ist normalerweise der erste Methode, die Sie in einer neuen Sitzung aufrufen würden, um sicherzustellen, dass die Das erneute Anhängen Ihrer getrennten Instanzen ist die erste Operation ausgeführt.
Es hat mir geholfen. DAO:
%Vor%POJO-Anzeigen (Ein Nutzer hat viele Anzeigen):
%Vor%Verwenden Sie das integrierte Sitzungstool:
%Vor%Öffnen und schließen Sie sie nicht manuell.
Die Sammlung versucht, zwei Sitzungen zugeordnet zu sein. Auch SessionFactory
ist, obwohl absolut gültig, nicht Teil von JPA. JPA basiert auf EntityFactory
.
Ihre Methoden, da Sie die Klasse als transaktional definieren, erfordern nicht, dass manuell eine Transaktion startet. Entfernen Sie diese (und alle Verweise auf Transaktionen) aus saveorUpdate
.
Transaktionen gehen üblicherweise auf die Service-Ebene, nicht auf die Repositories. Sie können also mehrere Repository- / DAO-Aufrufe in eine Service-Layer-Methode einfügen, die transaktional ist.
Das Problem war auf einen Missbrauch der Kaskadenaktualisierung in einer der Zuordnungen zurückzuführen. Hier ist eine Beispielfeldzuordnung:
%Vor%Durch das Entfernen der cascade = CascadeType.ALL wurde das Problem behoben. Fazit: Verwenden Sie Kaskaden-Updates sorgfältig, da Sie dadurch in Schwierigkeiten geraten können. Verwenden Sie es, wenn die Geschäftslogik dies erfordert. In dem Beispiel unten gab es keinen Grund dafür, also war das Entfernen sowohl geschäftlich als auch programmatisch eine gute Entscheidung.
Quelle: Ссылка
Ich hatte ein ähnliches Problem wie Sie und ich fanden keine Lösung für mein spezifisches Problem. Ich musste die Sitzung für die Sammlung manuell schließen mit:
%Vor%Ich denke, es ist nicht gut, um das Problem so zu lösen, aber für mich war es der einzige Weg.
EDIT: Das funktioniert natürlich nur bei einem Set, nicht wenn die Collection eine Liste oder etw. ist. sonst ...
Tags und Links java hibernate spring-mvc annotations sessionfactory