web-dev-qa-db-fra.com

Spring MongoRepository est en cours de mise à jour ou de mise à jour au lieu d'insérer

J'utilise un:

org.springframework.data.mongodb.repository.MongoRepository

Je commence avec une base de données vide et crée un objet avec _id = 1234 par exemple, et définissez un autre champ String sur hello par exemple, puis procédez comme suit:

repository.save(object);

Tout va bien, il enregistre le document dans MondoDB.

Je crée un nouvel objet, définissez le même _id = 1234 mais définissez l'autre champ String sur world puis sur une autre sauvegarde:

repository.save(newObject);

Résultats: la sauvegarde fonctionne mais met à jour l'objet d'origine.

Résultats attendus: cela devrait échouer avec un DuplicateKeyException comme _id est unique et j'utilise 2 objets distincts lors de chaque sauvegarde.

Défaut au printemps ou est-ce que je fais quelque chose de mal ???

20
Marc

Enregistrer , par définition, est censé mettre à jour un objet dans le style upsert, mettre à jour s'il est présent et insérer sinon. Lisez la documentation d'opération save sur MongoDb site Web

L'opération d'insertion dans mongodb a le comportement que vous attendez, mais d'après la documentation de MongoRepository, il semble que l'insertion est déléguée pour enregistrer, donc cela ne fera aucune différence . Mais vous pouvez essayer et voir si cela fonctionne pour vous. Sinon, vous pouvez simplement faire un get avant pour vérifier si l'objet existe, car c'est une recherche d'index, ce sera rapide.

Modifier : Vérifiez la version de votre référentiel, insérer a été introduit dans version 1.7 .

30
tinker

l'application ne se mettra à jour que si vous avez une annotation @Id pour l'un des champs, après une longue difficulté trouvée

@Document(collection="bus")
public class Bus {

//  @Indexed(unique=true, direction=IndexDirection.DESCENDING, dropDups=true)
    @Id
    private String busTitle; 
    private int totalNoOfSeats;
    private int noOfSeatsAvailable; 
    private String busType; 
}

mais je ne pouvais pas utiliser @Indexed (unique = true, direction = IndexDirection.DESCENDING, dropDups = true)

4
Naveen