Estaba recopilando información sobre el método flush(), pero no estoy muy claro cuándo usarlo y cómo usarlo correctamente. Según lo que leí, tengo entendido que los contenidos del contexto de persistencia se sincronizarán con la base de datos, i. mi. emitir estados pendientes o refrescar datos de la entidad.Uso correcto de flush() en JPA/Hibernate
Ahora tengo el siguiente escenario con dos entidades A
y B
(en una relación de uno a uno, pero no forzada o modelada por JPA). A
tiene un PK compuesto, que se establece manualmente, y también tiene un campo de IDENTIDAD autogenerado recordId
. Este recordId
se debe escribir en la entidad B
como clave externa al A
. Estoy guardando A
y B
en una sola transacción. El problema es que el valor autogenerado 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 al em.persist()
en A
. (Si tengo una IDENTIDAD PK autogenerada, el valor se actualiza directamente en la entidad, pero no es el caso aquí).
¿Puede em.flush()
causar daños al usarlo dentro de una transacción?
Lo que él dijo. El comportamiento em.flush() hace eco de java.io.Flushable.flush() donde todos los datos almacenados en el búfer se envían a cualquier destino que sea apropiado. – Erik
if flush() envía datos a la base de datos? ¿Qué sucede si se lanza una excepción después de eso? ¿El gerente de la entidad revertirá todo? incluso los datos escritos en el primer color? –
flush() envía instrucciones SQL a la base de datos como INSERT, UPDATE, etc. No enviará COMMIT, por lo que si tiene una excepción después de un flush(), aún puede tener una reversión completa. – Flavio