Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

java.util.ConcurrentModificationException on CollectionOfElements

I seem to get a ConcurrentModificationException when I have a CollectionOfElements inside an Embedabble.

If would like to have it like that, however If I change Route from Embedabble's to Entity than everything works fine. I have even tried adding @Version, but that doesn't seem to work.

Here are a snippet of my classes. 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;

I have generated Hashcode/equals for Coordinates and Route

like image 913
Shervin Asgari Avatar asked Oct 19 '09 15:10

Shervin Asgari


2 Answers

Check this JIRA entry.

ConcurrentModificationException when collection of embeddable contains a collection

It's a known bug in the Annotation Binder. And the issue lies in Hibernate Core which doesn't support collections in collections of embedded.

like image 154
jitter Avatar answered Nov 16 '22 02:11

jitter


I can't give you any Hibernate-specific advice - but ConcurrentModificationExceptions often mean that a collection is being modified inside its iterator, such as

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

Normally you can avoid this by explicitly creating an Iterator and calling its remove() method instead of the Collection's - but if this is internal Hibernate code you won't have that option.

like image 24
Andrzej Doyle Avatar answered Nov 16 '22 01:11

Andrzej Doyle