2009-10-19 5 views
8

Je semble obtenir une exception ConcurrentModificationException lorsque j'ai un objet CollectionOfElements dans un Embedabble.java.util.ConcurrentModificationException sur CollectionOfElements

Si je voudrais l'avoir comme ça, cependant si je change Route de Embedabble à Entity que tout fonctionne bien. J'ai même essayé d'ajouter @Version, mais cela ne semble pas fonctionner.

Voici un extrait de mes cours. 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; 

J'ai généré Hashcode/égaux pour les coordonnées et la Route

+0

Pouvez-vous nous montrer la trace de la pile et le code associé (s'il n'est pas montré ici) –

Répondre

9

Cochez cette entrée JIRA.

ConcurrentModificationException when collection of embeddable contains a collection

Il est un bug connu dans l'annotation Binder. Et le problème réside dans Hibernate Core qui ne supporte pas les collections dans les collections de embedded.

+2

+1. Intégrable dans une collection ne peut pas avoir de collections propres, car il n'y a pas de clé primaire définie pour les (sous) collections à lier. Vous devrez faire de Route une entité même si vous pouvez toujours faire en sorte que son cycle de vie soit contrôlé par Kart et donc, sémantiquement, il ne sera pas différent de Constreddable en dehors de la couche DAO. – ChssPly76

+0

Merci. Je l'ai déjà fait comme une solution de contournement. –

3

Je ne peux pas vous donner de conseil spécifique à Hibernate - mais ConcurrentModificationExceptions signifient souvent qu'une collection est modifiée dans son iterator, comme

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

Normalement, vous pouvez éviter cela en créant explicitement un itérateur et appelant sa méthode supprimer() au lieu de la collection de - mais si c'est le code Hibernate interne, vous n'aurez pas cette option.

0

L'utilisation de "@CollectionOfElements" et "@Embeddable" est source de confusion. Je suppose que vous voulez que Route et Coordinates soient des tables séparées? Si oui, ils ne devraient vraiment pas être @Embeddable. @Embeddable représente quelque chose qui peut être incorporé dans la table parent. Par exemple, pour utiliser des clés composites, vous utilisez généralement un @EmbeddedId comme PK, qui renvoie à une classe @Embeddable. Comme vous mentionnez que le passage à Entity semble résoudre le problème, je pense que vous devriez changer Route et Coordinate pour séparer les entités. Ensuite, vous aurez une configuration de modèle beaucoup plus standard qui devrait effacer votre problème.

Questions connexes