2017-09-03 2 views
-1

Ich habe zwei Hibernate-Klassen in Play/Scala, Group und Item, wo eine Gruppe viele Elemente haben kann. Was ich brauche, ist, alle Gegenstände aus einer Gruppe zu entfernen. Ich versuche, so zu entfernen:ConcurrentModificationException in Play für Scala + Hibernate

val group = session.get(classOf[Group],groupCode) 
val it = group.items.iterator 
while(it.hasNext) { 
    val i = it.next 
    group.items.remove(i) 
} 

Die erste Iteration funktioniert gut, aber auf der zweiten Iteration ich ConcurrentModificationException bekommen.

Was ist diese Ausnahme und wie Sie dieses Problem beheben können?

Antwort

1

Wenn Sie Element aus der Liste entfernen möchten, die Sie derzeit verwenden iterieren

it.remove() 

Es entfernt von der darunterliegenden Sammlung das letzte Element dieses Iterator zurückgegeben.

Wenn Sie Gründe interessieren warum ConcurrentModificationException hier geworfen wird, wenn Sie die Liste direkt ändern Sie einen Blick auf diese javadoc nehmen http://docs.oracle.com/javase/8/docs/api/java/util/ConcurrentModificationException.html

Beachten Sie, dass diese Ausnahme immer nicht an, dass ein Objekt gleichzeitig wurde modifiziert durch einen anderen Thread. Wenn ein einzelner Thread eine Sequenz von Methodenaufrufen ausgibt, die den Vertrag eines Objekts verletzen, kann das Objekt diese Ausnahme auslösen. Wenn ein Thread beispielsweise eine Auflistung direkt ändert, während er die Auflistung mit einem Fail-Fast-Iterator wiederholt, löst der Iterator diese Ausnahme aus.

+0

'it.remove' funktioniert, aber wenn ich das übergeordnete Objekt speichere, bekomme ich eine SQL-Ausnahme von Hibernate. Im SQL-Log sehe ich, dass es versucht, die Items-Tabelle zu aktualisieren, anstatt die Zeilen zu löschen. Da JDBC versucht, eine Spalte mit null festzulegen, gibt JDBC den Fehler aus. Dies ist der Protokolleintrag: 'update items set group_sk = null wobei group_sk =?'. Warum versucht es zu aktualisieren anstatt zu löschen? – ps0604

+0

Das Entfernen von Elementen aus der group.items-Liste entfernt nur die Verbindung zwischen Element und Gruppe - Item-Objekt selbst wird nicht gelöscht. Wenn Sie Item Objekt löschen möchten, müssen Sie session.delete (i) – mateuszlo