Configuring Ehcache with JPA, Hibernate & Spring

This post details on the steps required to configure ehcache as the second level hibernate cache when jpa, hibernate and spring are used in combination

Configuring the cache

Add the below properties to the persistence.xml configuration file

<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.use_query_cache" value="true"/>
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider"/>
<property name="hibernate.generate_statistics" value="true"/>

EHCache comes with some sensible defaults out of the box when you configure caching. But you can create your own configuration by creating a file named ehcache.xml and placing it in your class path. The xml file can contain

<cache name="samples.Employee"
           maxElementsInMemory="2000"
           eternal="false"
           timeToIdleSeconds="1800"
           timeToLiveSeconds="3600"
           overflowToDisk="false"/>

Configuring the Entity

Add the below annotation on your mapped entity

@org.hibernate.annotations.Cache(usage = org.hibernate.annotations.CacheConcurrencyStrategy.READ_WRITE)

You have now configured the cache for loading a single object at a time. For example the loadById kind of methods. When you are doing more like finder queries, query by example or using Criteria queries, you are not using second level cache. So if we have a queries that we execute a lot, we need to use the query cache.

Query Cache

To enable query caching, you need to make two configurations. One is to enable the property “hibernate.cache.use_query_cache” as we did above and second is to set the query cache hint as show below

        Query query = entityManager.createQuery("from " + Employee.class.getName());
        query.setHint("org.hibernate.cacheable", true);
        return query.getResultList();

Does you cache work? View statistics

Execute the below code to print the cache statistics

EntityManagerFactoryInfo entityManagerFactoryInfo =
(EntityManagerFactoryInfo) applicationContext.getBean("entityManagerFactory");
EntityManagerFactory emf = entityManagerFactoryInfo.getNativeEntityManagerFactory();
EntityManagerFactoryImpl emfImp = (EntityManagerFactoryImpl)emf;
System.out.println(emfImp.getSessionFactory().getStatistics());

Do not forget to enable the generation of statistics in your persistence.xml as described in the cache configuration above.

Posted on November 8, 2011, in ehcache, hibernate, jpa, spring and tagged . Bookmark the permalink. 3 Comments.

  1. can i have one showcase with full source code…i have tried with this ..but getting one exception saying ‘Second level cache in not enable’…

  2. Indeed, do you have a sample code of this one that works? Please post! It would be helpful.

  3. Hi there! This post couldn’t be written any better! Reading this post reminds me of my good old room mate! He always kept talking about this. I will forward this write-up to him. Pretty sure he will have a good read. Many thanks for sharing!

Leave a comment