Spring-Hibernate: Unzulässiger Versuch, eine Sammlung mit zwei offenen Sitzungen zu verknüpfen

7

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?

    
Dramorian 16.04.2014, 11:20
quelle

5 Antworten

12

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%     
D.Zhur. 29.10.2015 07:30
quelle
5

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 .

%Vor%

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.

    
NimChimpsky 16.04.2014 11:33
quelle
3

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: Ссылка

    
Lazy Coder 19.12.2014 12:03
quelle
2

Problem könnte, wenn Sie unter Code

verwenden

anstelle von getSession() , wenn Sie '

verwenden

getHibernateTemplate().getSessionFactory().openSession() , bewirkt, dass zwei Sitzungen gleichzeitig geöffnet werden.

    
Naveen 16.04.2014 12:43
quelle
0

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 ...

    
Diana 20.07.2017 21:23
quelle