iberck
11/5/2015 - 7:15 PM

Hibernate Session Flush

Hibernate Session Flush

Flush

Hacer flush de la sesión forza a que hibernate sincronice el estado en memoria de la sesión con la base de datos (es decir escribir los cambios a la base de datos). Por defecto, hibernate hará flush de la sesión automáticamente por usted cuando:

  • Antes de algunos queries
  • Cuando se hace commit de una transacción

Hacer un flush explicito de la sesión le da más control sobre cosas que puede requerir en algunas circunstancias (obtener un id asignado, controlar el tamaño de la sesión,...)

Cuando se hace flush NO se está haciendo commit de la transacción, los datos no serán commited/rollback hasta que la transacción lo haga explicitamente.

Flush mode

Sirve para indicar al orm en qué momentos debe hacer flush a la sesión.

ALWAYS: La sesión es vaciada (flush) antes de cualquier query.

AUTO (default): La sesión es vaciada (flush) cuando se hace commit de una transacción de hibernate Transaction.commit(), antes de algunos queries para asegurar que los queries nunca regresen datos antiguos, y cuando se invoca session.flush().

COMMIT: La sesión es vaciada (flush) cuando se hace commit de las transacciones Transaction.commit().

MANUAL: La sesión es vaciada (flush) solo cuando se invoca manualmente el método Session.flush().

NEVER: Deprecated, utilice MANUAL.

Flush grails

No se aconseja mucho utilizar persona.save(flush:true) porque no le estas permitiendo a hibernate hacer su trabajo (optimizar los saves). Utiliza flush:true solo donde sea necesario, por ejemplo después de un procesamiento por lotes.

En los controladores flush es = MANUAL, dentro de las transacciones Flush=AUTO