Cómo deshabilitar el almacenamiento en caché de hibernación

Estoy tratando de escribir una clase de prueba unitaria que tendrá que usar la misma consulta para obtener los resultados de la base de datos dos veces en el mismo método de prueba. Pero como la memoria caché de Hibernate está habilitada por segunda vez, no está llegando a la base de datos y simplemente buscando los resultados de la memoria caché.

¿Puede alguien responder cómo deshabilitar el almacenamiento en caché en persistence.xml ?

Traté de deshabilitar cambiando las propiedades hibernate.cache.use.query_cache = false e hibernate.cache.use_second_level_cache = false .

Pero no funcionó.

¿Puede alguien responder cómo deshabilitar el almacenamiento en caché en persistence.xml?

El caché de segundo nivel y el caché de consultas están deshabilitados de manera predeterminada (y las consultas no se almacenan en caché a menos que las almacene en caché explícitamente ). El caché de primer nivel no se puede deshabilitar.

Intenté deshabilitar cambiando las propiedades (…)

Esto deshabilitaría el caché de segundo nivel y el caché de consultas, si estuvieran habilitados.

Pero no funcionó.

Para ser honesto, “no funcionó” es una descripción muy pobre del comportamiento actual frente al esperado. Proporcionar más detalles, (pseudo) código, rastreos de SQL probablemente sería útil.

Dicho esto, si la pregunta es sobre HQL, una consulta HQL definitivamente debe golpear la base de datos en la ejecución posterior (sin ningún caché de consultas). Active el registro de SQL si es necesario para observar esto.

Si la pregunta es sobre Session#get() o Session#load() , entonces podría volver a cargar el estado de una entidad usando Session#refresh() o llamar a Session#clear() para borrar completamente la sesión.

Hibernate tiene dos niveles de caché,

  1. Caché de sesión (caché de primer nivel) es caché predeterminada y no hay ningún mecanismo para deshabilitar.

  2. Caché de nivel de SessionFactory (segundo nivel): tenemos que configurar esto en el archivo cfg de Hibernate configurando cache_provider.

    Tenía un requisito para cargar datos pesados ​​de DB, y utilicé la sesión sin estado debido a las siguientes funciones.

      a. Stateless session does not support session cache and never interact with second level cache. b. Stateless session does not support automatic dirty check. c. Stateless session does not support cascading to associated entities. 

    Sintaxis para crear una sesión sin estado:

     StatelessSession statelessSession = sessionFactory.openStatelessSession(); 

Puedes usar:

session.setCacheMode(CacheMode.IGNORE)

despues de ti:

instrucción session.createQuery("from Table") .

Esto asegurará que Hibernate no interactúe con la memoria caché de segundo nivel para cualquier entidad devuelta por esta consulta.

Si crea una sesión nueva (diferente) dentro de su prueba de unidad, “no” usará la anterior. O si llama a clear () primero (otra opción), etc.

De acuerdo con un chico del equipo de hibenrate:

El caché de segundo nivel no tiene nada que ver con el caché de primer nivel (contexto de sesión o de persistencia). El contexto de persistencia / caché de sesión es obligatorio por varias razones. De hecho, no entender esta parte crucial e ignorarla en la architecture de la aplicación es una receta para el desastre. No hay una solución rápida aquí, estudia cierta documentación.

Fuente: https: //forum.hibernate.org/viewtopic.php? P = 2383408
Puede usar seesion.evict (su objeto) antes de volver a intentar la misma consulta.

Después de la primera vez que consulta el resultado, llame a session.clear y luego la misma consulta golpeará la base de datos en lugar de la memoria caché de nivel 1.