Spring Hibernate StaleObjectStateException aufgrund neuer HashSet?

8

Mein Code funktionierte für eine lange Zeit einwandfrei, aber nach ein paar Refactors bemerkte ich, dass ich plötzlich kein Group Objekt mehr speichern konnte.

Ich bekam den gefürchteten Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) Fehler. Nach dem Googeln fand ich natürlich diese StackOverflow-Frage , aber es hat mir überhaupt nicht geholfen, da ich nicht gleichzeitig etwas getan habe.

Nachdem ich meine Refactors durchgegangen bin, ist der einzige Unterschied, den ich gefunden habe, diese Änderung.

Vorher war es:

%Vor%

Nach dem Refactoring (erinnere mich nicht genau, warum) wurde es:

%Vor%

Nachdem es wieder auf das Original zurückgesetzt wurde, hat es plötzlich jedes Mal wieder funktioniert, ohne irgendwelche Fehler.

Könnte jemand bitte erklären, was der Grund für diesen Fehler ist, da dies buchstäblich der einzige Unterschied im Code ist, der es wieder funktioniert?

Update 1:

Ich habe eine andere Variante versucht:

%Vor%

Hinweis ArrayList anstelle von HashSet - aus irgendeinem Grund funktioniert dieser Code .

Ich habe auch LinkedList ausprobiert, was auch funktioniert .

Irgendwelche Ideen?

Update 2:

Der Stack-Trace ist wie folgt: Ich habe es geschnitten, um viele Spring und Tomcat-bezogene Spuren zu entfernen.

%Vor%     
Crembo 16.04.2015, 11:12
quelle

3 Antworten

3

In Ihrem neuen Code erstellen Sie ein neues HashSet , das alle Sample -Elemente in allByBarcode collection enthält.

Und ich denke, dass das Problem hier auftritt, weil diese Elemente nicht von der Sitzung beibehalten werden, weil sie neue Objekte sind, die der new HashSet() -Instanz hinzugefügt wurden und sie nicht wirklich von der Sitzung gespeichert werden, erklärt Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) Exception jedoch werden die allByBarcode -Elemente Ihrem Dienst entnommen, sodass sie dauerhaft und von der Sitzung erkannt werden .

Und ich sehe nicht, was nötig ist, um eine neue HashSet -Instanz zu setzen, in der die Elemente von der Sitzung gespeichert (gespeichert) werden sollen (was Exception verursacht, weil Sie versuchen, Elemente mit existierendem Bezeichner zu speichern) ) Während es effizienter und sicherer ist, die bereits gespeicherten Elemente zu setzen, sollten Sie besser verwenden:

%Vor%     
chŝdk 24.04.2015 09:09
quelle
1

Ich denke, das Problem besteht darin, dass Sie einige Duplikatobjekte in Ihrer Sammlung allByBarcode haben, die verschwinden, wenn Sie Ihre Sammlung in ein HashSet verpacken, das keine Duplikate zulässt. Was danach passiert, ist: Ihr Repository versucht, dasselbe Objekt mehrmals zu speichern.

    
Mostafa EL BARRAK 16.04.2015 11:21
quelle
0

Da Sie das Beispielobjekt bereits als HashSet initialisieren, können Sie dies versuchen, anstatt es erneut zu initialisieren.

%Vor%     
Surendra Poranki 28.04.2015 19:25
quelle

Tags und Links