2009-10-19 5 views
8

Embedabble内にCollectionOfElementsがあると、ConcurrentModificationExceptionが発生するようです。CollectionOfElementsのjava.util.ConcurrentModificationException

もし私がEmbedabble'sからEntityへのRouteをすべてうまく動かすよりも変更したければ、それは好きです。私は@Versionの追加を試みたこともありますが、それはうまくいかないようです。

ここに私のクラスのスニペットがあります。 Kart.java:

@Entity 
public class Kart { 

@Id @GeneratedValue 
private Long id; 

@Column(nullable=false,length=256) 
@NotNull 
@Length(max=256) 
private String name; 

@OneToOne(cascade=CascadeType.ALL) 
private File file; 

@Version 
private int version; 

@CollectionOfElements 
private Set<Route> route; 

Route.java:

@Embeddable 
public class Route { 

@Parent 
private Kart kart; 

@NotNull 
@Column(nullable = false, length = 256) 
private String name; 

@NotNull 
@Column(nullable = false) 
private Boolean visible = Boolean.valueOf(true); 

@CollectionOfElements 
private Set<Coordinates> coordinates; 

@Version 
private int version; 

Coordinates.java:

@Embeddable 
public class Coordinates { 

@NotNull 
private int x; 

@NotNull 
private int y; 

@Parent 
private Route route; 

@Version 
private int version; 

私はハッシュコード/座標とルートのために等しい

+0

スタックトレースと関連コード(ここに表示されていない場合) –

答えて

9

このJIRAエントリを確認してください。

ConcurrentModificationException when collection of embeddable contains a collection

それは注釈バインダーの既知のバグです。そして、問題はHibernate Coreにあります.Hibernate Coreは埋め込みコレクションのコレクションをサポートしていません。

+2

+1を表示できますか?コレクション内に埋め込み可能なものは、それらの(サブ)コレクションにリンクするための主キーが定義されていないため、独自のコレクションを持つことはできません。ルートをエンティティにする必要がありますが、Kartによってそのライフサイクルが制御され、意味的にDAOレイヤの外にあるEmbeddableと変わりはありません。 – ChssPly76

+0

ありがとうございます。私はすでにこれを回避策として行っていました。 –

3

を生成しています私はあなたにHibernate固有のアドバイスを与えることはできません - しかしConcurrentModificationExceptionsは、多くの場合、あなたが明示的にIteratorを作成し、代わりにコレクションののそののremove()メソッドを呼び出すことによってこれを避けることができ、このような通常

for (String s : myStringCollection) 
{ 
    if (s.startsWith("XXX")) 
    { 
     myStringCollection.remove(s); 
    } 
} 

として、コレクションがそのイテレータの内部で修正されていることを意味する - しかし、もしこれは内部のHibernateコードであり、あなたはそのオプションを持たないでしょう。

0

"@CollectionOfElements"と "@Embeddable"の使い方は混乱します。あなたはルートと座標を別々のテーブルにしたいと思いますか?もしそうなら、それらは本当に@Embeddableであってはなりません。 @Embeddableは、親テーブルに埋め込むことができるものを表します。たとえば、コンポジットキーを使用するには、通常、@EmbeddedIdをPKとして使用します。これは@Embeddableのクラスにリンクします。

エンティティに切り替えると問題が解決したようですが、ルートと座標を別のエンティティに切り替える必要があると思います。それでは、あなたの問題を解決するはるかに標準的なモデルのセットアップがあります。

関連する問題