example ejemplo java hibernate jpa transactions persistence

java - ejemplo - Uso correcto de flush() en JPA/Hibernate



java jpa example (2)

En realidad, em.flush() , hace más que simplemente enviar los comandos SQL en caché. Intenta sincronizar el contexto de persistencia con la base de datos subyacente. Puede causar un gran consumo de tiempo en sus procesos si su caché contiene colecciones para sincronizar.

Precaución al usarlo.

Estaba recopilando información sobre el método flush (), pero no estoy muy claro cuándo usarlo y cómo usarlo correctamente. Por lo que leí, entiendo que los contenidos del contexto de persistencia se sincronizarán con la base de datos, es decir, emitiendo estados pendientes o refrescando datos de entidades.

Ahora tengo el siguiente escenario con dos entidades A y B (en una relación de uno a uno, pero no ejecutado o modelado por JPA). A tiene un PK compuesto, que se establece manualmente, y también tiene un recordId campo IDENTITY recordId . Este recordId debe escribirse en la entidad B como una clave externa para A Estoy guardando A y B en una sola transacción. El problema es que el valor auto-generado A.recordId no está disponible dentro de la transacción, a menos que realice una llamada explícita de em.flush() después de llamar a em.persist() en A (Si tengo un IDENTITY PK autogenerado, el valor se actualiza directamente en la entidad, pero ese no es el caso aquí).

¿Puede em.flush() causar algún daño al usarlo dentro de una transacción?


Probablemente los detalles exactos de em.flush() dependen de la implementación. En general, de todos modos, los proveedores de JPA como Hibernate pueden almacenar en caché las instrucciones de SQL que supuestamente deben enviar a la base de datos, a menudo hasta que realicen la transacción. Por ejemplo, si llama a em.persist() , Hibernate recuerda que tiene que hacer una em.persist() base de datos, pero en realidad no ejecuta la instrucción hasta que no haya confirmado la transacción. Afaik, esto se hace principalmente por motivos de rendimiento.

En algunos casos, de todos modos, desea que las instrucciones SQL se ejecuten inmediatamente; generalmente cuando necesita el resultado de algunos efectos secundarios, como una clave autogenerada o un activador de base de datos.

Lo que em.flush() hace es vaciar el caché interno de instrucciones SQL y ejecutarlo inmediatamente en la base de datos.

En pocas palabras: no se hace daño, solo usted podría tener un golpe de rendimiento (menor) ya que está anulando las decisiones del proveedor de JPA con respecto al mejor momento para enviar instrucciones SQL a la base de datos.