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
ocascade=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 laEntityExistsException
, o laEntityExistsException
u otraPersistenceException
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
ocascade=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
unaIllegalArgumentException
(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
ocascade=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
ocascade=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
ocascade=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.