CodeGym /Cours /All lectures for FR purposes /Comment changer un objet dans Hibernate

Comment changer un objet dans Hibernate

All lectures for FR purposes
Niveau 1, Leçon 299
Disponible

Les nuances de la méthode merge()

Si vous souhaitez utiliser Hibernate pour modifier un objet qui a déjà été stocké dans la base de données, il existe également plusieurs méthodes pour cela.

La première est la méthode merge() , qui met à jour les informations dans la base de données en fonction de l'objet passé . Cela invoquera la requête SQL UPDATE. Exemple:

User user = new User();
user.setName("Kolyan");
session.save(user);

session.evict(user);     // detach the object from the session
user.setName("Masha");

User user2 = (User) session.merge(user);

Il y a plusieurs nuances importantes ici.

Tout d'abord, la méthode merge() renvoie le résultat, l'objet mis à jour. Cet objet a un état Persist et est attaché à l'objet de session. L'objet passé à la méthode merge() ne change pas.

Il peut sembler qu'il n'y a pas de différence entre user et user2, mais ce n'est pas le cas. Vous pouvez passer un objet POJO à la méthode merge() , et par conséquent, la méthode peut renvoyer un proxy (selon les paramètres d'hibernation). N'oubliez donc pas que la méthode merge () ne modifie pas l'objet passé.

Deuxièmement, si l'objet passé à merge() a le statut Transient (et qu'il n'a pas d'ID), une ligne distincte sera créée pour lui dans la base de données. En d'autres termes, la commande persist() sera exécutée .

Troisièmement, si un objet déjà attaché à la session (avec le statut Persist) est passé à la méthode merge() , alors rien ne se passera - la méthode renverra simplement le même objet. Pourquoi? Et tout cela parce que lorsque la transaction est validée, les données seront de toute façon écrites dans la base de données :

User user = new User();
user.setName("Kolyan");
session.save(user);

user.setName("Masha"); //change the object attached to the session

session.close();  //all changed objects will be written to the database

Il n'est pas nécessaire d'enregistrer l'objet à chaque fois après l'une de ses modifications. Si cet objet est en statut Persist, alors Hibernate fera tout lui-même. Si vous modifiez un objet "attaché à la base", toutes ses modifications seront écrites dans la base.

Les nuances de la méthode update()

Hibernate a également une méthode update() , qui, comme la méthode save() , a été héritée des versions précédentes. Avec cette méthode, vous ne pouvez mettre à jour que les données d'un objet déjà enregistré. Cela invoquera la requête SQL UPDATE. Exemple:

User user = new User();
user.setName("Kolyan");
session.save(user);

session.evict(user);     // detach the object from the session
user.setName("Masha");

session.update(user);

Cette méthode ne renvoie rien et ne modifie pas l'objet existant.

Si vous appelez cette méthode sur un nouvel objet, une exception sera simplement levée :

User user = new User();
user.setName("Kolyan");
session.update(user);   //an exception will be thrown here

Méthode saveOrUpdate()

Avant l'avènement de JPA, la fonction de la méthode persist() était exécutée par la méthode saveOrUpdate() . Sa tâche était de mettre à jour les informations sur l'objet existant dans la base de données, et s'il n'y en a pas, de le créer. Il est presque toujours utilisé à la place des méthodes save() et update() .

Contrairement à la méthode update() , elle peut modifier l'objet qui lui est transmis. Par exemple, définissez-le sur l'ID qui a été attribué lors de l'enregistrement dans la base de données. Exemple:

User user = new User();
user.setName("Kolyan");
session.saveOrUpdate(user);   //object will be written to the database

Comment ça fonctionne:

  • si l'objet passé a un ID, alors la méthode UPDATE SQL est appelée
  • si l'ID de l'objet passé n'est pas défini, la méthode INSERT SQL est appelée
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION