2017-09-03 1 views
-1

Play/Scalaに2つのHibernateクラス、GroupItemがあります。ここで1つのグループは多くのアイテムを持つことができます。私が必要とするのは、グループからすべてのアイテムを削除することです。Scala + Hibernate用の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を取得する2回目の繰り返し上:私はこのように削除してみてください。

この例外とは何か、この問題を解決する方法は何ですか?

答えて

1

あなたが現在使用し

it.remove() 

を反復され、リストから要素を削除したい場合は、基になるコレクションから、反復子によって返された最後の要素を削除します。

あなたがリストを変更した場合にConcurrentModificationExceptionがここにスローされます理由に興味がある場合は、直接、あなたは、この例外は常にオブジェクトが同時にされていることを示していないことを、このjavadocのhttp://docs.oracle.com/javase/8/docs/api/java/util/ConcurrentModificationException.html

ノートを見てみることができます別のスレッドによって変更されました。 1つのスレッドがオブジェクトの契約に違反する一連のメソッド呼び出しを発行すると、オブジェクトはこの例外をスローする可能性があります。たとえば、スレッドがフェイル・ファースト・イテレータを使用してコレクションを反復している間に、スレッドがコレクションを直接変更した場合、イテレータはこの例外をスローします。

+0

'it.remove'は機能しますが、親オブジェクトを保存すると、HibernateによってスローされたSQL例外が発生します。 SQLログでは、行を削除するのではなく、アイテムテーブルを更新しようとしています。 nullで列を設定しようとするため、JDBCはエラーをスローします。これはログエントリです。 'update items set group_sk = null where group_sk =?'なぜ、削除の代わりに更新を試みるのですか? – ps0604

+0

group.itemsリストから項目を削除すると、項目とグループ間の接続のみが削除されます.Itemオブジェクト自体は削除されません。 Itemオブジェクトを削除したい場合は、session.delete(i)を実行する必要があります。 – mateuszlo

関連する問題