2012-07-06 5 views
1

J'essaie de persister une relation (propriétaire) à plusieurs (voiture) avec la morphine (0,99)/mongoDB (2). Lorsque j'essaie de conserver la classe Car avec une référence au propriétaire de la classe, Morphia lance une exception $ DuplicateKey MongoException. C'est étrange puisque je pensais que la cascade persistante n'existait pas dans la morphine. Pourquoi la morphine lève-t-elle une exception de clé dupliquée pour index * index_username * sur la classe référencée Owner lorsque je persiste Car?Violation d'index sur une classe référencée, Morphia

Pojo:

@Entity(noClassnameStored=true, value="base") 
public class Base { 

    @Id 
    private ObjectId id; 
    ... 


@Entity(value = "owner", noClassnameStored = true) 
@Polymorphic 
public class Owner extends Base { 

    @Indexed(value = IndexDirection.ASC, unique=true, dropDups=true, name="index_username") 
    private String userName; 

    @Reference 
    private Set<Car> cars = new HashSet<Car>(); 
    ... 

@Entity(value="car", noClassnameStored=true) 
@Polymorphic 
public class Car extends Base{ 
    @Reference 
    private Owner owner 

Bean:

car.setOwner(owner); 
BeanUtil.getDataStore().save(car); 

Exception:

com.mongodb.MongoException$DuplicateKey: E11000 duplicate key error index: myapp.car.$index_username dup key: { : null } 
+0

Je dois dire que persistant le premier objet de voiture avec référence au propriétaire fonctionne bien . – Chris

Répondre

1

Vous ne pouvez pas ajouter plus d'une référence null. Soit ajouter une valeur pour toutes les entités (jusqu'à 1 peut être null) ou un ensemble sparse=true sur l'index afin que vous puissiez avoir des valeurs uniques, mais permettent à plusieurs null

+0

J'ai dû supprimer/supprimer l'ensemble de la base de données, puis il a commencé à fonctionner. Devinez qu'il cache l'index d'avant en quelque sorte?! Que veut dire Sparse dans Morphia, le doc java n'explique pas grand chose (sauf autoriser les valeurs nulles)? – Chris

+1

Etrange que vous deviez abandonner toute la DB - aurait supposé que l'abandon de l'index aurait été suffisant. Sparse indique à l'index qu'il doit ignorer les valeurs nulles sur les contrôles uniques; donc vous pouvez avoir plusieurs valeurs nulles alors que tous les non-null doivent être uniques. J'espère que cela sera plus clair. – xeraa

Questions connexes