2017-08-07 3 views
6

Je le modèle comme suitle modèle de printemps enregistre dans le même objet

@CompoundIndexes(value = { 
     @CompoundIndex(name = "catalog_idx", def = "{'code' : 1, 'brand' : 1}", unique = true) }) 
@Document(collection = Catalog.ENTITY) 
public class Catalog extends AbstractModel<String> { 

    private static final long serialVersionUID = 1L; 

    public static final String ENTITY = "catalog"; 

    @NotNull(message = "Code is required") 
    @Field("code") 
    private String code; 

    @NotNull(message = "Brand is required") 
    @DBRef(lazy = true) 
    @Field("brand") 
    private Brand brand; 
} 

Quand je ne sauvegardons avec mongoTemplate.save(object); je ne vois que deux objets créés dans DB au lieu de 6. Juste avant d'enregistrer mes lignes de débogage pour les objets être sauvé.

Catalog [code=StagedCatalog, brand=Brand [code=Brand_3]] 
Catalog [code=StagedCatalog, brand=Brand [code=Brand_2]] 
Catalog [code=StagedCatalog, brand=Brand [code=Brand_1]] 
Catalog [code=OnlineCatalog, brand=Brand [code=Brand_2]] 
Catalog [code=OnlineCatalog, brand=Brand [code=Brand_1]] 
Catalog [code=OnlineCatalog, brand=Brand [code=Brand_3]] 

Des idées pourquoi? Je sens que l'unique chose Index ne fonctionne pas en quelque sorte. Je veux code et brand être unique combination.

public abstract class AbstractModel<ID extends Serializable> implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    private ID id; 
} 
+0

vous avez du code qui crée Catalogue? Avez-vous une colonne "@id" dans le modèle abstrait? pouvez-vous vous connecter aussi? – wargre

+0

@wargre a fait .... –

Répondre

5

Vous avez défini un index unique. Cela signifie que vous ne pourrez pas avoir 2 documents avec le même code et la même marque.

Vous avez maintenant défini la colonne ID sur l'objet ID. Le fait que vous avez 2 insérer au lieu de 6 signifie que vous utilisez le même ID pour 3 insert, quelque chose comme:

for (code: {"StagedCatalog","OnlineCatalog"}) { 
    ID id=new ID(...); 
    for (brand: {1, 2, 3}){ 
     Catalog cat=new Catalog(); 
     cat.setId(id);    // <<== this is wrong, you reuse the same id, you will insert first brand, then update to brand2 and brand3. 
     cat.setCode(code); 
     cat.setBrand(brand); 
     mongoTemplate.persist(cat); 
    } 
} 

Pour éviter cela, vous devez:

Catalog cat=new Catalog(); 
ID id=new ID(realUniqueId); // RealuniqueId can be code+brand for instance 
cat.setId(id); 
... 
+0

L'ID est fixé par spring mongodb directement. –

+0

Vous êtes sûr que vous ne réutilisez pas le même objet? – wargre

+0

Oui, j'en suis sûr. Vous voyez les journaux juste avant que je ne sauve. Maintenant, aucune combinaison de code et de marque ne se contracte. Ce que j'ai compris des clés composées selon la documentation de printemps J'espère que ma config est correcte De plus, quand je sauvegarde tous ces objets sont frais cela signifie que l'ID est vide avant d'enregistrer et après avoir sauvegardé ils auront une valeur. Donc, je ne comprends pas pourquoi printemps mongodb épargne avec l'entité existante. Ainsi, le printemps composé mongodb clé unique, je suppose que la combinaison est unique et non le code individuel et la marque sont uniques. –