Platinum Partner
architects,high-perf,performance,tips and tricks

Hibernate 4 and Ehcache higher than 2.4.3

For those using Hibernate 4, if you want to use Ehcache, you must add a specific dependency: hibernate-ehcache

But there’s a catch, it embeds Ehcache 2.4.3, which is unconvenient as the latest version of Ehcache is 2.7.0

So if you are looking to use Hibernate 4, you should exclude the embeded Ehcache dependency.

In your pom.xml, it will look like this:

<dependency>
 <groupId>org.hibernate</groupId>
 <artifactId>hibernate-core</artifactId>
 <version>4.1.9.Final</version>
</dependency>

<dependency>
 <groupId>org.hibernate</groupId>
 <artifactId>hibernate-ehcache</artifactId>
 <version>4.1.9.Final</version>
 <exclusions>
 <exclusion>
  <groupId>net.sf.ehcache</groupId>
  <artifactId>ehcache-core</artifactId>
 </exclusion>
</exclusions>

</dependency>

Then according to the version of ehcache, you will need either ehcache or ehcache-core

Up to 2.6.x:

<dependency>
 <groupId>net.sf.ehcache</groupId>
 <artifactId>ehcache-core</artifactId>
 <version>2.5.7</version>
</dependency>

Starting at 2.7.0:

<dependency>
 <groupId>net.sf.ehcache</groupId>
 <artifactId>ehcache</artifactId>
 <version>2.7.0</version>
</dependency>

Changes in your code:

Please note that Ehcache contains classes to support Hibernate 3, but  hibernate-ehcache contains classes for Hibernate 4

Meaning that in your classpath, you’ll end up with two packages:

For Hibernate 3, classes are in the package : net.sf.ehcache.hibernate.*

But for Hibernate 4, classes are in the package : org.hibernate.cache.ehcache.*

So your hibernate configuration will need these properties to be set up:

<property name="hibernate.cache.region.factory_class">
org.hibernate.cache.ehcache.EhCacheRegionFactory
</property>

Please note that it is: org.hibernate.cache.ehcache.EhCacheRegionFactory while for Hibernate 3, it was net.sf.ehcache.hibernate.EhCacheRegionFactory

So be really careful in your code, you could have

import net.sf.ehcache.hibernate.*;

which will compile but then fail at run time since this is for Hibernate 4. Whatever hibernate class you’re using, you should have:

import org.hibernate.cache.*;

The exception is for the property net.sf.ehcache.configurationResourceName that will contain the path to your ehcache xml config file, just like in Hibernate 3

Similarly, just like for Hibernate 3, you will need:

<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.use_query_cache">false</property>

Eventually it would make sense that the Hibernate folks have a dependency on ehcache instead of embedding it in their hibernate-ehcache dependency, that would make things easier.





Published at DZone with permission of {{ articles[0].authors[0].realName }}, DZone MVB. (source)

Opinions expressed by DZone contributors are their own.

{{ tag }}, {{tag}},

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}
{{ parent.authors[0].realName || parent.author}}

{{ parent.authors[0].tagline || parent.tagline }}

{{ parent.views }} ViewsClicks
Tweet

{{parent.nComments}}