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.
(Note: Opinions expressed in this article and its replies are the opinions of their respective authors and not those of DZone, Inc.)





