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 anull
pour les champs que vous ne souhaitez pas enregistrer ce que vous pourriez faire est dans l'autre sens, utiliser les entrantsUser
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/...
Vous devez vous connecter pour publier un commentaire.
J'ai eu la même question, et M. Deinum points, la réponse est non, vous ne pouvez pas utiliser l'option enregistrer. Le principal problème étant que les Données du Printemps ne sais pas quoi faire avec les valeurs null. Est la valeur null pas définie ou est-il créé parce qu'il doit être supprimé?
Maintenant, à en juger par vous remettre en question, je suppose que vous avez aussi eu la même pensée que j'ai eu, qui a qui save me permettrait d'éviter de régler manuellement toutes les valeurs modifiées.
Ainsi est-il possible d'éviter tous les le manuel de cartographie alors? Eh bien, si vous choisissez d'adhérer à la convention que les valeurs null signifie toujours "pas de jeu" et vous avez l'original de l'id de modèle, alors oui.
Vous pouvez éviter toute cartographie de vous-même en utilisant des Ressorts BeanUtils.
Vous pouvez effectuer les opérations suivantes:
Maintenant, le Printemps est BeanUtils réelle ne supporte pas de ne pas copier les valeurs null, donc il va écraser toutes les valeurs qui ne sont pas mis à null sur la sortie du modèle objet. Heureusement, il y a une solution ici:
Comment ignorer les valeurs null à l'aide de springframework BeanUtils copyProperties?
Donc, en mettant tout cela ensemble vous vous retrouvez avec quelque chose comme ceci
userRepository.save(existing);
pas#save(user);
En utilisant JPA, vous pouvez le faire de cette façon.
@Version
terrain et gérer les optimisting de verrouillage des exceptions. Mais juste uniquement la mise à jour de la colonne que vous voulez est beaucoup plus simple.le problème n'est pas de printemps de données jpa liées mais l'implémentation jpa lib que vous utilisez liés.
Dans le cas du mode veille prolongée, vous pouvez jeter un oeil à:
http://www.mkyong.com/hibernate/hibernate-dynamic-update-attribute-example/
dynamic-update
bien: j'ai juste essayé de le faire à l'aide d'annotations, mais cette propriété n'est pas prise en charge dans JPA de @Entité d'annotation et de Hibernate @Entity est obsolète.... Connaissez-vous la bonne façon de le mettre?dynamic-update
est à l'aide de@DynamicUpdate
annotation... j'ai essayé mais je n'ai pas vu de changement... une suggestion?Si vous lisez la demande Chaîne JSON, ce qui pourrait être fait à l'aide de Jackson API. Voici le code ci-dessous. Code compare existant POJO Éléments et de créer une nouvelle mis à jour les champs. L'utilisation de la nouvelle POJO persister.
Sortie finale serait, de l'Avis seulement lastNm et les Commentaires sont en raison de l'évolution.
Vous êtes capable d'écrire quelque chose comme
Ou Si vous voulez mettre à jour uniquement les champs qui ont été modifiés, vous pouvez utiliser les annotations
Exemple de Code:
Pour longtemps,int et d'autres types;
vous pouvez utiliser le code suivant;