Cuando llama al session.save(a)
, Hibernate recuerda básicamente en algún lugar dentro de la sesión que este objeto debe ser guardado. Puede decidir si desea emitir INSERT INTO...
inmediatamente, algún tiempo después o en la confirmación. Esta es una mejora en el rendimiento, que permite a Hibernate insertar por lotes o evitarlos si la transacción se retrotrae.
Cuando llama al session.flush()
, Hibernate se ve forzado a emitir INSERT INTO...
en la base de datos. La entidad se almacena en la base de datos, pero aún no se ha comprometido. Dependiendo del nivel de aislamiento de la transacción, no será visto por otras transacciones en ejecución. Pero ahora la base de datos sabe sobre el registro.
Cuando llama al transaction.rollback()
, Hibernate retrocede la transacción de la base de datos. La base de datos maneja la reversión, eliminando así el objeto recién creado.
Considere ahora el escenario sin flush()
. En primer lugar, nunca toca la base de datos por lo que el rendimiento es mejor y la reversión es básicamente una operación no operativa. Por otro lado, si el nivel de aislamiento de transacción es READ UNCOMMITTED
, otras transacciones pueden ver el registro insertado incluso antes de la confirmación/restitución. Sin flush()
, esto no sucederá, a menos que Hibernate no decida flush()
implícitamente.
no pude pensar en la transacción de hibernación que se asemeja a la transacción de DB real de alguna manera. gracias ! ¿Puedes verificar esta pregunta también? que me permite hacer esta pregunta que has respondido. http://stackoverflow.com/questions/9903872/hibernate-session-save-creating-not-neccessary-insert-statements – kommradHomer
Esta parte de la respuesta no es correcta: "hibernate es lo suficientemente inteligente como para no enviar inserciones/actualizaciones a la DB hasta que sepa si la transacción se va a comprometer o revertir ".Hibernate enviará insertos/actualizaciones a la base de datos cada vez que la sesión se vacíe, y esto puede ser antes de saber si la transacción se va a comprometer o revertir. – SteveT
@SteveT ¿Conoces alguna situación en la que la sesión se vacíe sin llamar a .flush() o confirmar la transacción? – ilcavero