2012-05-29 16 views
10

Me preguntaba si alguien podría decirme qué es una sesión sucia de hibernación. Parece que tengo un problema donde una consulta de criterios realiza una inserción cuando no debería. Creo que está relacionado con una sesión sucia, pero sin saber realmente qué tan sucia es la sesión, no puedo resolver mi problema. Además, ¿cómo se crea una sesión sucia? Gracias.¿Qué es una sesión sucia de Hibernate?

Respuesta

19

La sesión de Hibernate es una memoria caché. Almacena entidades leídas de la base de datos en caché y también almacena en caché los cambios que ha realizado en las entidades que contiene, así como entidades añadidas y eliminadas, hasta que la sesión se vacíe (es decir, todos los cambios pendientes se escriben en la base de datos).

Se dice una sesión sucio cuando aún no se han eliminado algunos cambios. Y, por lo tanto, es perfectamente normal tener una sesión sucia. La sesión se vacía antes de confirmar la transacción.

+0

si no quiero que la consulta desencadene una descarga, si establezco la consulta de criterios setFlushMode en manual, o lo consideraría una ayuda de banda ¿fijar? –

+0

@George si no desea guardar los cambios realizados en los objetos, intente hacer esos cambios fuera de la sesión – richarbernal

+0

Supongo que tendré que buscar información adicional sobre cómo almacenar mis datos fuera de la sesión. Todavía soy bastante nuevo para hibernar, por lo que no estoy del todo seguro de cómo comenzó la sesión. –

2

Simplemente significa que ha realizado cambios en objetos persistentes en memoria, administrados, que aún no han sido descargados a la base de datos.

Básicamente, la idea detrás de hibernar es que el estado de los objetos persistentes en memoria es el estado de la aplicación. Si realiza un cambio en un objeto gestionado, hibernate lo colocará en la base de datos en la próxima oportunidad. No debe realizar cambios "temporales" en los objetos administrados que no pretende que sean persistentes, porque lo serán.

Antes de ejecutar una consulta, hibernate vacía el estado en memoria de todos los objetos administrados en la base de datos, de modo que la consulta sea precisa en relación con el estado de su aplicación.

+0

En realidad, es más complicado que eso: Hibernate se vacía solo si los cambios pendientes podrían tener un impacto en la consulta ejecutada. –

+0

¿Hay alguna manera recomendada de evitar que la consulta realice una inserción antes de decirle que inserte el objeto? Utilicé setFetchMode en el manual que funcionó, sin embargo, creo que esto podría ser solo una corrección de banda en lugar de una corrección de raíz. –

+1

El FlushMode se puede cambiar para toda la aplicación en SessionFactory, probablemente para COMMIT, no MANUAL, si no desea que se realicen inserciones y actualizaciones antes del final de la transacción. Sin embargo, esa es la solución, si está realizando cambios en las entidades administradas que no desea que se escriban en la base de datos, no solo una bandaida. – Affe

5

Una sesión sucia en Hibernate es cuando carga un objeto dentro de la sesión y luego lo modifica.

O, cuando abre una sesión y crea un objeto nuevo.

Incluso si usted no llama explicitily cualquier operación de inserción/actualización, Hibernate marca la sesión como sucia y guarda los cambios cuando se cierra la sesión

2

En palabras simples: como sabemos Dirty data es el que aún no se ha confirmado. Del mismo modo, la sesión sucia en hibernación contiene datos modificados que aún no se han confirmado.

Cuestiones relacionadas