web-dev-qa-db-fra.com

comment les données de printemps jpa repository.save ne font que la mise à jour

Comment spring-data-jpa repository.save ne fait que update mais PAS en créer une nouvelle si la clé primaire n'est pas trouvée.
Actuellement, repository.save () créera un enregistrement now dans ma base de données s'il n'est pas trouvé

14
Awakening

Repository.save() est une méthode à double objectif pour Insérer ainsi que Mettre à jour

Il existe deux mécanismes utilisés par Spring pour décider s'il doit utiliser Insérer ou Mettre à jour sur une entité:

  1. Par défaut, Spring inspecte la Id-Property (@Id) De l'entité, pour déterminer si l'entité est nouvelle ou non. Si la propriété identifiant est nulle, l'entité est traitée comme nouvea, sinon pas nouveau.
  2. Une autre façon de mieux contrôler cela est d'implémenter Persistable. Pour les entités qui implémentent Persistable, Spring appellera la méthode isNew(…) pour déterminer si elle doit être insérée ou Mis à jour .
22
Manish Maheshwari

@ManishMaheshwari signifiait Repository.findeOne (Id). Voici un exemple de contrôleur:

 @RequestMapping(value = "/recipes/{id}/edit", method = RequestMethod.POST)
  public String saveEditedRecipe(@PathVariable("id") Long id){
    Recipe recipe = recipes.findOne(id);

    //do anything you want

    recipes.save(recipe);

    return "redirect:/recipes/" + recipe.getId();
  }

Dans ce cas, nous obtenons la valeur Id existante du chemin et la transmettons dans le .findOne (). De cette façon, nous obtenons la recette avec l'ID correct que nous voulons mettre à jour. Ensuite, vous pouvez faire une logique supplémentaire ou simplement .save (). En utilisant cette approche, il mettra à jour l'entité avec l'ID que vous avez transmis à coup sûr.

1
Mykola Nagorskyi