¿Cuál es la diferencia entre persist () y merge () en Hibernate?
persist()
puede crear una consulta ACTUALIZAR E INSERTAR, 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 lo que el persist()
método puede generar una inserción 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 actualice 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
Respuestas:
La especificación JPA contiene una descripción muy precisa de la semántica de estas operaciones, mejor que en javadoc:
fuente
persist
vsmerge
?Esto viene de
JPA
. De una forma muy sencilla:persist(entity)
debe usarse con entidades totalmente nuevas, para agregarlas a DB (si la entidad ya existe en DB, habrá EntityExistsException throw).merge(entity)
debe usarse para devolver la entidad al contexto de persistencia si la entidad se separó y se cambió.fuente
Se debe llamar a Persist solo en entidades nuevas, mientras que la fusión está destinada a volver a adjuntar entidades separadas.
Si está usando el generador asignado, usar merge en lugar de persist puede causar una declaración SQL redundante , lo que afecta el rendimiento.
Además, llamar a la fusión para entidades administradas también es un error, ya que las entidades administradas son administradas automáticamente por Hibernate y su estado se sincroniza con el registro de la base de datos mediante el mecanismo de verificación sucia al vaciar el contexto de persistencia .
fuente
La diferencia más importante es esta:
En el caso del
persist
método, si la entidad que se va a gestionar en el contexto de persistencia ya existe en el contexto de persistencia, se ignora la nueva. (No pasó nada)Pero en el caso del
merge
método, la entidad que ya está administrada en el contexto de persistencia será reemplazada por la nueva entidad (actualizada) y una copia de esta entidad actualizada regresará. (de ahora en adelante, se deben realizar cambios en esta entidad devuelta si desea reflejar sus cambios en el contexto de persistencia)fuente