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