I'm using Hibernate second level cache in my application, for certain business reason I can't change the entity annotation any more.

In my project, apart from changing the Database from Hibernate, there exist also other native SQL that do not go through Hibernate. Therefore, the Hibernate second-level cache data could be stale after database being updated from native SQL. That's why I want to disable the second-level cache for certain entities (programmatically or other way than changing annotation).

Thanks in advance!

Was it helpful?


WARNING: As Jens Schauder noted, it is impossible to configure Ehcache to store 0 elements in memory by setting maxElementsInMemory="0" as it effectively causes opposite effect - sets unlimited size for the cache. This behaviour is not mentioned on the Hibernate Caching page but is documented on Cache Configuration page.

I have quickly reviewed the documentation and haven't found alternative approach yet. I am unable to delete this answer by myself. :-(

My original suggestion:

You can configure the implementation provider of second level cache to short TTL times and/or to store 0 entries of particular entity type.

E.g. if you are using the Ehcache, you can configure it in ehcache.xml:*

maxElementsInMemory="0" <<== this should effectively disable caching for EntityName
overflowToDisk="false" <<== Do not overflow any entries to disk

See Hibernate Caching in Ehcache documentation.


In Terracotta 3.1 and above, you can enable/disable Hibernate 2nd Level Caches on a per region basis, both in the configuration (statically) and at runtime, using the Terracotta Developer Console.

You can also monitor in realtime statistics about the cache and Hibernate, for individual nodes in a cluster or cluster-wide.

Terracotta is open source. For more details, check out Terracotta for Hibernate.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow