JPA: mise à jour que certains champs

Est-il un moyen pour la mise à jour de seulement quelques champs d'une entité de l'objet à l'aide de la méthode save de Spring Data JPA?

Par exemple j'ai une entité JPA comme ceci:

@Entity
public class User {

  @Id
  private Long id;

  @NotNull
  private String login;

  @Id
  private String name;

  //getter /setter
  //...
}

Avec ses CRUD repo:

public interface UserRepository extends CrudRepository<User, Long> { }

Dans Spring MVC j'ai un contrôleur obtenir un User objet pour le mettre à jour:

@RequestMapping(value = "/rest/user", method = RequestMethod.PUT, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public ResponseEntity<?> updateUser(@RequestBody User user) {

   //Assuming that user have its id and it is already stored in the database,
   //and user.login is null since I don't want to change it,
   //while user.name have the new value

   //I would update only its name while the login value should keep the value 
   //in the database
   userRepository.save(user);

   //...
}

Je sais que je pourrais charge de l'utilisateur à l'aide de findOne, puis changer son nom et de le mettre à jour à l'aide de save... Mais si j'ai 100 champs et je veux mettre à jour 50 d'entre eux pourrait être très ennuyeux de changer à chaque valeur..

Il n'y a pas moyen de dire quelque chose comme "ignorer toutes les valeurs null lorsque vous enregistrez l'objet"?

  • Non il n'y en a pas. La seule possibilité est de récupérer l'objet, de mettre à jour les champs et de les stocker, et qui pourraient être dynamique. Si vous voulez quelque chose d'autre que vous aurait à écrire de SQL et de faire vous-même. Mais en supposant que le User seulement a null pour les champs que vous ne souhaitez pas enregistrer ce que vous pourriez faire est dans l'autre sens, utiliser les entrants User et mettre à jour les champs que vous connaissez n'ont pas changé, puis mise à jour.
  • Est-il un pourquoi pour ce qui est préférable pour ne pas sauter les valeurs null mise à jour d'un objet?
  • Il n'y a aucun moyen fiable de savoir quoi sauter, null peut être une option valable pour les champs, alors quoi? Vous pourriez probablement chausse-pied quelque chose en place avec ann EntityListener ou quelque chose comme ça, mais je vous recommande fortement contre elle, comme il sera probablement conduire à plus de problèmes qu'elle n'en résout.
  • Vous utilisez une implémentation JPA qui fait que par défaut, peut-être. Celui que j'utilise (DataNucleus) met à jour uniquement les champs, j'ai changé. Aurait pensé que c'était la valeur par défaut pour tous ...
  • peut-être que je me trompe, mais ce que je voudrais essayer de faire est de ne pas changer les valeurs puis de mettre à jour seulement, car je n'ai jamais récupérer l'objet, mais il est comme je l'ai créer un nouveau paramètre l'id de la... Ce que je voudrais obtenir, c'est juste pour ignorer les valeurs null dans la mise à jour de l'opération... Ce que vous suggérez, il semble que le @DynamicUpdate(valeur = true) dans la mise en veille prolongée (qui ne fonctionne pas dans mon cas)
  • L'utilisateur ci-dessous référence: stackoverflow.com/questions/53129556/...

InformationsquelleAutor Andrea | 2015-01-07