update saveorupdate example java hibernate jpa orm entity

java - saveorupdate - spring jpa merge



¿Cuál es la diferencia entre persist() y merge() en Hibernate? (3)

Esto viene de JPA. De una manera muy simple:

persist (entidad) debe usarse con entidades totalmente nuevas, para agregarlas a DB (si la entidad ya existe en DB, habrá throw EntityExistsException).

merge (entity) debe usarse para volver a poner a la entidad en contexto de persistencia si la entidad se separó y se modificó.

¿Cuál es la diferencia entre persist () y merge () en Hibernate?

persist() puede crear una consulta UPDATE & INSERT, por ejemplo:

SessionFactory sef = cfg.buildSessionFactory(); Session session = sef.openSession(); A a=new A(); session.persist(a); a.setName("Mario"); session.flush();

en este caso, la consulta se generará así:

Hibernate: insert into A (NAME, ID) values (?, ?) Hibernate: update A set NAME=? where ID=?

por persist() método persist() puede generar un Insertar y una Actualización.

Ahora con merge() :

SessionFactory sef = cfg.buildSessionFactory(); Session session = sef.openSession(); Singer singer = new Singer(); singer.setName("Luciano Pavarotti"); session.merge(singer); session.flush();

Esto es lo que veo en la base de datos:

SINGER_ID SINGER_NAME 1 Ricky Martin 2 Madonna 3 Elvis Presley 4 Luciano Pavarotti

Ahora actualiza un registro usando merge()

SessionFactory sef = cfg.buildSessionFactory(); Session session = sef.openSession(); Singer singer = new Singer(); singer.setId(2); singer.setName("Luciano Pavarotti"); session.merge(singer); session.flush();

Esto es lo que veo en la base de datos:

SINGER_ID SINGER_NAME 1 Ricky Martin 2 Luciano Pavarotti 3 Elvis Presley


Se debe llamar a Persist solo en entidades nuevas, mientras que fusionar significa volver a conectar entidades separadas.

Si está utilizando el generador asignado, usar fusionar en lugar de persistir puede provocar una instrucción SQL redundante , lo que afecta el rendimiento.

Además, la combinación de llamada para entidades administradas también es un error, ya que Hibernate administra las entidades administradas automáticamente y su estado se sincroniza con el registro de la base de datos mediante el mecanismo de comprobación sucia al enjuagar el Contexto de persistencia .


La especificación JPA contiene una descripción muy precisa de la semántica de estas operaciones, mejor que en javadoc:

La semántica de la operación persistente , aplicada a una entidad X es la siguiente:

  • Si X es una entidad nueva, se convierte en administrada. La entidad X se ingresará en la base de datos al momento o antes de la confirmación de la transacción o como resultado de la operación de descarga.

  • Si X es una entidad gestionada preexistente, es ignorada por la operación persistir. Sin embargo, la operación persistirá en cascada a las entidades a las que hace referencia X, si las relaciones de X a estas otras entidades se anotan con el elemento de anotación en cascade=PERSIST o cascade=ALL o especificado con el elemento descriptor XML equivalente.

  • Si X es una entidad eliminada, se gestiona.

  • Si X es un objeto separado, la EntityExistsException puede lanzarse cuando se invoca la EntityExistsException , o la EntityExistsException u otra PersistenceException pueden lanzarse al momento o comprometer el tiempo.

  • Para todas las entidades Y referenciadas por una relación de X, si la relación con Y se ha anotado con el valor del elemento de cascade=PERSIST o cascade=ALL , la operación de persistencia se aplica a Y.

La semántica de la operación de fusión aplicada a una entidad X es la siguiente:

  • Si X es una entidad separada, el estado de X se copia en una instancia de entidad gestionada preexistente X ''de la misma identidad o se crea una nueva copia administrada X'' de X.

  • Si X es una nueva instancia de entidad, se crea una nueva instancia de entidad gestionada X ''y el estado de X se copia en la nueva instancia de entidad gestionada X''.

  • Si X es una instancia de entidad eliminada, la operación de combinación IllegalArgumentException una IllegalArgumentException (o la confirmación de transacción fallará).

  • Si X es una entidad gestionada, la operación de fusión la ignora; sin embargo, la operación de fusión se aplica en cascada a entidades referenciadas por relaciones de X si estas relaciones se han anotado con el valor del elemento en cascade=MERGE o cascade=ALL anotación.

  • Para todas las entidades Y a las que se hace referencia por las relaciones de X que tienen el valor del elemento en cascade=MERGE o cascade=ALL , Y se fusiona recursivamente como Y ''. Para todos los Y a los que hace referencia X, X ''se establece para hacer referencia a Y''. (Tenga en cuenta que si se administra X, entonces X es el mismo objeto que X '').

  • Si X es una entidad fusionada a X '', con una referencia a otra entidad Y, donde cascade=MERGE o cascade=ALL no está especificado, entonces la navegación de la misma asociación desde X'' produce una referencia a un objeto gestionado Y ''con el misma identidad persistente que Y.