Spring Data JPA: Comment mettre à jour un modèle d'élégance?
-
Mon Modèle, c'est comme cela:
@Entity @Table(name = "user") public class User { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @Column(name="email") private String email; @Column(name = "weblink") private String webLink; //getter & setter }
-
nous recueillons forme ou de données mobiles via requête http, et spring mvc fera de ces données à un Modèle comme utilisateur.
par exemple, j'ai une requête comme ceci:
http://localhost:8080/update?id=1919&[email protected]
-
dans contolleur, l'url de la requête et de ses paramètres seront automaticlly trans pour une
User
objet.@RequestMapping(method = RequestMethod.GET, value = "/update0") public User update(@ModelAttribute("User") User user){ System.out.println(user.getId()); System.out.println(user.getEmail()); System.out.println(user.getWebLink()); return userRepository.save(test); }
-
si j'ai un record dans mysql dont le numéro est en 1919, et les colonnes (id, email, weblik) sont tous des valeurs.
comme vous le voyez, l'utilisateur de l'objet qui est passé par le web ou le mobile ont deux propriétés
http://localhost:8080/update?id=1919&[email protected]
id et e-mail ont des valeurs et des weblink n'ont pas.
Donc, si j'exécute
save
méthode, les colonnes e-mail sera mis à jour pour[email protected]
, et la weblik domaine seront également mis à jour pourNULL
, mais je ne veux pas mettre à jour ce champ, je veux juste la mise à jour du champ e-mail. -
J'ai deux façons de résoudre le problème, mais tous ne sont pas élégant.
5.1 la charge de l'utilisateur de l'objet de la première et de la mise à jour
User userExist = userRepository.findOne(user.getId()); userExist.setEmail(user.getEmail()); //or using //BeanUtil.copyProprty(formDto,modle) userRepository.save();
5.2 utilisation de
@DynamicUpdate
, mais sa ne fonctionne pas.Est-il d'autre moyen de mettre à jour le Modèle de l'Utilisateur et de ne pas faire un travail supplémentaire.
Merci d'avance.
OriginalL'auteur diligent | 2015-08-02
Vous devez vous connecter pour publier un commentaire.
Le plus simple est de bien définir la méthode du contrôleur:
Selon la la documentation de référence lorsque cette méthode est appelée les étapes suivantes se produisent:
User
doit être obtenue. Cela nécessite fondamentalement uneConverter
deString
àUser
pour être enregistrée avec Spring MVC pour convertir le segment de chemin extraites à partir de l'URI modèle dans uneUser
. Si vous êtes par exemple à l'aide de Données du Printemps et de permettre son support sur le web, comme décrit dans ses la documentation de référence, cela fonctionne hors de la boîte.Des conseils supplémentaires
GET
comme méthode HTTP pour les mises à jour.GET
est définie comme une exploitation sûre (sans effets secondaires), qui un jour ne l'est pas.PATCH
est la bonne méthode ici qu'elle est définie pour permettre des mises à jour partielles à une ressource existante.PUT
etPATCH
demandes, vous devez vous inscrire à unHttpPutFormContentFilter
avec l'application comme décrit ici. J'ai déposé un problème avec Spring Boot de registre par défaut.Oublie ça, j'ai trouvé le problème. HttpPutFormContentFilter n'a pas été créé parce que je suis l'extension de WebMvcConfigurerAdapter et qui empêche l'instanciation de WebMvcAutoConfiguration. Maintenant j'ai une autre question, pourquoi HttpPutFormContentFilter est appliquée uniquement lorsque le type de contenu application/x-www-form-urlencoded? Est-il possible d'appliquer le même processus mais avec une application/json type de contenu? Merci!
avez-vous trouver un moyen élégant pour mettre en œuvre cette JSON et/ou XML?
Est-il de toute façon à obtenir l'Id d'un authenticationObject pour l'instanciation? Actuellement dans la solution u, elle nécessite code d'utilisateur pour être envoyé dans
"/users/{user}"
. J'ai besoin de cela parce que lorsque l'utilisateur avec l'id 1 connecte, je tiens simplement à goto la page/user
au lieu de/user/1
.Quand ils veulent pour mettre à jour quelque chose, ils seraient encore goto PATCH/user
au lieu de PATCH/user/1
OriginalL'auteur Oliver Drotbohm
Au premier abord, j'ai besoin de dire la
Patch
solution par@Oliver Gierke
est vraiment génial.Et Dans mon précédent projet, ma solution est la suivante:
1. Créer une classe abstraite pour mettre en œuvre
JpaRepository
, et de mettre en œuvresave()
fonction.2. Dans la fonction enregistrer, obtenir de l'entité à partir de DB. Il n'existe pas, il suffit de la sauvegarder. Sinon, utiliser la réflexion pour obtenir tous les champs not NULL à partir de la mise à jour de l'entité et l'entité de DB. (il est similaire comme vous le faites, mais je l'ai fait pour l'ensemble de la fonction de sauvegarde)
OriginalL'auteur Mavlarn
Tout d'abord, vous devrait utiliser HTTP POST lorsque vous êtes sur le point de mettre à jour les données.
Deuxièmement,
@DynamicUpdate
est d'environ quelque chose d'autre, ce n'est pas votre solution. Il à propos de la génération de SQL de mise à jour des énoncés à moins de colonnes.Vous devez effectuer l'une des opérations suivantes:
https://server/updateEmail
ethttps://server/updateWeblink
UserRepository.save()
méthode de mise à jour de la DB de données avec des champs null, c'est à dire commeif (webObject.getField() != null) dbObject.setField(webObject.getField())
OriginalL'auteur Turan Yüksel