2009-10-19 10 views
8

Wydaje mi się uzyskać wyjątek ConcurrentModificationException, gdy mam CollectionOfElements wewnątrz Embedabble.java.util.ConcurrentModificationException na CollectionOfElements

Jeśli chciałbym, aby tak było, jednak jeśli zmienię trasę z Embedabble na Entity, to wszystko działa dobrze. Próbowałem nawet dodać @Version, ale to nie działa.

Oto fragment moich zajęć. 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 generowane Kod źródłowy/wynosi dla współrzędnych i Route

+0

Czy możesz pokazać nam ślad stosu i powiązany kod (jeśli nie pokazano tutaj)? –

Odpowiedz

9

Sprawdź ten wpis JIRA.

ConcurrentModificationException when collection of embeddable contains a collection

To znany błąd w adnotacji Binder. Problem leży w Hibernate Core, który nie obsługuje zbiorów w kolekcjach osadzonych.

+2

+1. Osadzanie w kolekcji nie może mieć własnych kolekcji, ponieważ nie istnieje klucz podstawowy zdefiniowany dla tych (pod) kolekcji, do których ma prowadzić link. Musisz uczynić z Trasy obiekt, chociaż nadal możesz sprawić, by jego cykl życia był kontrolowany przez Kartę, a zatem semantycznie nie będzie się różnił od Embeddable poza warstwą DAO. – ChssPly76

+0

Dzięki. Zrobiłem to już jako obejście. –

3

Nie mogę udzielić żadnej porady dotyczącej Hibernacji - ale ConcurrentModificationExceptions często oznacza, że ​​zbiór jest modyfikowany wewnątrz jego iteracyjnej, takich jak

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

Normalnie można tego uniknąć poprzez wyraźne tworzenie iterator i nazywając jego remove() Metoda zamiast Collection - ale jeśli jest to wewnętrzny kod hibernacji, w którym nie będziesz mieć tej opcji.

0

Użycie "@CollectionOfElements" i "@Embeddable" jest mylące. Zakładam, że chcesz, aby trasa i współrzędne były oddzielnymi tabelami? Jeśli tak, to naprawdę nie powinny być @Embeddable. @Embeddable reprezentuje coś, co można osadzić w tabeli nadrzędnej. Na przykład, aby używać kluczy złożonych, zwykle używasz @EmbeddedId jako swojego PK, który łączy się z klasą, która jest @Embeddable.

Ponieważ wspomniałeś, że przejście na Entity wydaje się naprawić problem, myślę, że powinieneś zmienić Trasę i Koordynację na osobne Elementy. Wtedy będziesz miał znacznie bardziej standardową konfigurację modelu, która powinna usunąć twój problem.