2017-09-03 28 views
-1

我在Play/Scala中有兩個Hibernate類,GroupItem,其中一個組可能有很多項。我需要的是從組中刪除所有項目。我嘗試刪除這樣的:在Play Scala +休眠中發生ConcurrentModificationException

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

第一次迭代工作正常,但在第二次迭代,我得到ConcurrentModificationException

這是什麼異常以及如何解決這個問題?

回答

1

如果你想從列表中刪除元素,即當前迭代使用

it.remove() 

它從底層集合中刪除這個迭代器返回的最後一個元素。

如果你有興趣的原因,如果您修改列表直接就可以在此的javadoc看看http://docs.oracle.com/javase/8/docs/api/java/util/ConcurrentModificationException.html

請注意,此異常不會總是指示對象是否已同時ConcurrentModificationException的送過來扔由不同的線程修改。如果單個線程發出違反對象合約的一系列方法調用,則該對象可能會拋出此異常。例如,如果一個線程在使用快速迭代器迭代集合的同時直接修改集合,迭代器將拋出此異常。

+0

'it.remove'的作品,但是當我保存父對象時,我得到了Hibernate拋出的SQL異常。在SQL日誌中,我看到它試圖更新項目表而不是刪除行。由於它嘗試使用null設置列,因此JDBC會引發錯誤。這是日誌條目:'update items set group_sk = null where group_sk =?'。爲什麼它會嘗試更新而不是刪除? – ps0604

+0

從group.items列表中刪除項目只會刪除項目和組之間的連接 - 它不會刪除項目對象本身。如果你想刪除Item對象,你需要做session.delete(i) – mateuszlo