2009-10-19 7 views
8

Mi sembra di ottenere un ConcurrentModificationException quando ho un oggetto CollectionOfElements all'interno di un Embedabble.java.util.ConcurrentModificationException su CollectionOfElements

Se si desidera averlo in quel modo, tuttavia Se cambio Route da Embedabble a Entity di quanto tutto funzioni correttamente. Ho anche provato ad aggiungere @Version, ma non sembra funzionare.

Ecco uno snippet delle mie classi. 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; 

Ho generato hashCode/uguale per le coordinate e la Route

+0

Puoi mostrarci la traccia dello stack e il relativo codice (se non mostrato qui) –

risposta

9

Controllare questa voce JIRA.

ConcurrentModificationException when collection of embeddable contains a collection

Si tratta di un bug noto nella annotazione Binder. E il problema si trova in Hibernate Core, che non supporta le raccolte nelle raccolte di embedded.

+2

+1. L'incorporamento all'interno di una raccolta non può avere alcuna propria raccolta perché non esiste una chiave primaria definita per quelle (sotto) raccolte a cui collegarsi. Avrai bisogno di rendere Route un'entità sebbene tu possa ancora fare in modo che il suo ciclo vitale sia controllato da Kart e quindi semanticamente non sarà diverso da Embeddable al di fuori del livello DAO. – ChssPly76

+0

Grazie. L'ho già fatto come soluzione. –

3

Non posso darti alcun consiglio specifico sull'Hibernate - ma ConcurrentModificationExceptions spesso significano che una collezione è in corso di modifica all'interno del suo iteratore, come ad esempio

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

Normalmente è possibile evitare questo creando in modo esplicito un Iterator e chiamando il suo metodo al posto della Collezione del remove() - ma se questo è il codice Hibernate interno che non avrai questa opzione.

0

L'utilizzo di "@CollectionOfElements" e "@Embeddable" è confuso. Suppongo tu voglia che Route e Coordinate siano tabelle separate? Se è così, in realtà non dovrebbero essere @Embeddable. @ Embedded rappresenta qualcosa che può essere incorporato nella tabella genitore. Ad esempio, per utilizzare le chiavi composite di solito utilizzi un @EmbeddedId come PK, che si collega a una classe che è @Embeddable.

Poiché si menziona che il passaggio a Entity sembra risolvere il problema, penso che si dovrebbe cambiare Route e Coordinate per separare Entità. Quindi avrai una configurazione di modello molto più standard che dovrebbe risolvere il tuo problema.

Problemi correlati