Los matices del método merge()

Si desea utilizar Hibernate para cambiar un objeto que ya se ha almacenado en la base de datos, también existen varios métodos para ello.

El primero es el método merge() , que actualiza la información en la base de datos en función del objeto pasado . Esto invocará la consulta SQL UPDATE. Ejemplo:

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);

Hay varios matices importantes aquí.

Primero, el método merge() devuelve el resultado, el objeto actualizado. Este objeto tiene un estado persistente y está adjunto al objeto de sesión. El objeto pasado al método merge() no cambia.

Puede parecer que no hay diferencia entre usuario y usuario2, pero no es así. Puede pasar un objeto POJO al método merge() y, como resultado, el método puede devolver un proxy (según la configuración de Hibernate). Así que recuerda que el método merge() no cambia el objeto pasado.

En segundo lugar, si el objeto pasado a merge() tiene el estado Transitorio (y no tiene una ID), se creará una línea separada para él en la base de datos. En otras palabras, se ejecutará el comando persist() .

En tercer lugar, si un objeto ya adjunto a la sesión (con el estado Persist) se pasa al método merge() , entonces no pasará nada, el método simplemente devolverá el mismo objeto. ¿Por qué? Y todo porque cuando se confirme la transacción, los datos se escribirán en la base de datos de todos modos:

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

No hay necesidad de guardar el objeto cada vez después de cualquiera de sus cambios. Si este objeto está en estado persistente, Hibernate hará todo por sí mismo. Si cambia un objeto que está "adjunto a la base", todos sus cambios se escribirán en la base.

Los matices del método update()

Hibernate también tiene un método update() que, al igual que el método save() , fue heredado de versiones anteriores. Con este método, solo puede actualizar los datos de un objeto ya guardado. Esto invocará la consulta SQL UPDATE. Ejemplo:

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);

Este método no devuelve nada y no cambia el objeto existente.

Si llama a este método en un objeto nuevo, simplemente se lanzará una excepción:

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

Método saveOrUpdate()

Antes de la llegada de JPA, la función del método persist() la realizaba el método saveOrUpdate() . Su tarea era actualizar la información sobre el objeto existente en la base de datos y, si no hay ninguno, crearlo. Casi siempre se usa en lugar de los métodos save() y update() .

A diferencia del método update() , puede cambiar el objeto que se le pasa. Por ejemplo, configúrelo con el ID que se asignó al guardar en la base de datos. Ejemplo:

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

Cómo funciona:

  • si el objeto pasado tiene una ID, entonces se llama al método UPDATE SQL
  • si el ID del objeto pasado no está configurado, se llama al método INSERT SQL