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 ???
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 .
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)