Srinivas
Srinivas

Reputation: 351

How to disable hibernate caching

I am trying to write a unit test class which will have to use same query to fetch the results from database two times in same test method. But as Hibernate cache is enabled second time it is not actually hitting the database and simply fetching the results from cache.

Can someone please answer how to disable caching in persistence.xml.

I tried to disable by changing properties hibernate.cache.use.query_cache = false and hibernate.cache.use_second_level_cache = false.

But It did not work.

Upvotes: 35

Views: 85648

Answers (8)

Claudiomir
Claudiomir

Reputation: 129

As pointed out by kirill, em.clear() method can actually solve the problem in certain cases (worked for me):

entityManager.clear();

Upvotes: 4

rogerdpack
rogerdpack

Reputation: 66921

If you create a new (different) session within your unit test, it will "not" use the old one's cache. Or if you call clear() on it first (another option), etc.

Upvotes: 4

user2462377
user2462377

Reputation: 11

After the first time you query the result,call session.clear and then the same query will hit the database rather than level 1 cache

Upvotes: 0

Isabel Jinson
Isabel Jinson

Reputation: 8671

Hibernate has two levels of Cache,

  1. Session cache (First level cache) is default cache and there is no mechanism to disable.

  2. SessionFactory (second level) level cache : We have to configure this in Hibernate cfg file by setting cache_provider.

    I had an requirement to load heavy data from DB, and I used stateless session because of following features.

     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.
    

    Syntax to create Stateless session:

    StatelessSession statelessSession = sessionFactory.openStatelessSession();
    

Upvotes: 13

Sumeet
Sumeet

Reputation: 97

You can use:

session.setCacheMode(CacheMode.IGNORE)

after your:

session.createQuery("from Table") statement.

This will ensure that Hibernate doesn't interact with 2nd level cache for any entity returned by this query.

Upvotes: 8

frezzeraa
frezzeraa

Reputation: 1

According to a guy from the hibenrate team :

The second-level cache has nothing to do with the first-level (session or persistence context) cache. The persistence context/session cache is mandatory for various reasons. In fact, not understanding this crucial part and ignoring it in application architecture is a recipe for disaster. There is no quick solution here, study some documentation.

Source :https://forum.hibernate.org/viewtopic.php?p=2383408
You might use seesion.evict(your object) before retrying the same query.

Upvotes: 0

Pascal Thivent
Pascal Thivent

Reputation: 570595

Can someone please answer how to disable caching in persistence.xml.

The second-level cache and query cache are disabled by default (and queries are not cached unless you explicitly cache them). The first-level cache can't be disabled.

I tried to disable by changing properties (...)

This would disable the second-level cache and query cache, if they were enabled.

But It did not work.

To be honest, "it did not work" is a very poor description of the current behavior vs the expected one. Providing more details, (pseudo) code, SQL traces would probably help.

That being said, if the question is about HQL, an HQL query should definitely hit the database upon subsequent execution (without any query cache). Activate SQL logging if required to observe this.

If the question is about Session#get() or Session#load(), then you could reload the state of an entity using Session#refresh() or call Session#clear() to completely clear the session.

Upvotes: 24

Related Questions