2010-12-22 22 views
107

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

persist() puede crear una consulta INSERT ACTUALIZACIÓN &, 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 consulta será generado como esto:

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

así 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 actualizar un registro utilizando 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 
+7

El javadoc es muy explícito sobre lo que hacen y cuáles son las diferencias. ¿Lo has leído y entendido? – skaffman

+1

Compruebe http://stackoverflow.com/questions/161224/what-are-the-differences-between-the-different-saving-methods-in-hibernate –

+0

http://stackoverflow.com/questions/1069992/jpa- entitymanager-why-use-persist-over-merge – Bozho

Respuesta

136

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

La semántica de la operación, aplicado a una entidad X son como sigue:

  • Si X es una entidad nueva, se administra . La entidad X será ingresada en la base de datos al compromiso de transacción o como resultado de la operación de descarga.

  • Si X es una entidad gestionada preexistente , es ignorado por la operación persistir. Sin embargo, la operación es persistir en cascada a entidades referenciadas por X, si las relaciones de X a estas otras entidades se anotan con el valor del elemento cascade=PERSIST o cascade=ALL anotación o especificarse con el elemento descriptor XML equivalente.

  • Si X es una entidad eliminada, se gestiona.

  • Si X es un objeto individual, la EntityExistsException puede ser lanzado cuando el persistir se invoca la operación, o la EntityExistsException o otro PersistenceException pueden lanzado a ras o cometer tiempo.

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


El semant ics de la fusión operación aplica a una entidad X son los siguientes:

  • Si X es una entidad individual, el estado de X se copia en un pre-existente entidad gestionada ejemplo X' de se crea la misma identidad o una nueva copia administrada X 'de X .

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

  • Si X es una instancia de entidad eliminado, un IllegalArgumentException se lanzada por la operación de combinación (o la transacción comprometen fallará).

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

  • Para todos entidades Y referenciados por relaciones de X que tiene el elemento de cascada valor cascade=MERGE o cascade=ALL, Y se fusiona de forma recursiva como Y'. Para todos tal Y referenciado por X, X 'se establece en referencia Y'. (Tenga en cuenta que si X es gestionados entonces X es el mismo objeto que X ')

  • Si X es una entidad se fusionó a X', con una referencia a otra entidad Y, donde cascade=MERGE o cascade=ALL es no se especifica, la navegación de la misma asociación de X 'produce una referencia a un objeto de Y administrado' con la misma identidad persistente como Y.

+0

Gracias por la información. Veo la semántica de ambas definiciones. Pero la pregunta es sobre las diferencias entre ellos. ¿Quizás presente la lista de estados y 2 subsecciones para cada comportamiento diferente de 'persist' vs' merge'? –

+0

mejor explicación aquí - http://stackoverflow.com/a/1070629/710817 – whoami

13

Esto viene de JPA.De una manera muy simple:

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

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

+0

¿puede por favor agregar una fuente a su explicación? Gracias. –

+0

@ AlikElzin-kilaka tal explicación, como recuerdo, la he encontrado en un libro "Beginning Java EE 7". – Krystian

6

Persistir debe invocarse solo en entidades nuevas, mientras que fusionar significa volver a conectar entidades separadas.

Si está utilizando el generador asignado, using merge instead of persist can cause a redundant SQL statement, por lo tanto, afecta el rendimiento.

Además, calling merge for managed entities también es un error ya que las entidades gestionadas son manejados automáticamente por Hibernate y su estado está sincronizado con el registro de la base por la dirty checking mechanism sobre flushing the Persistence Context.

Cuestiones relacionadas