Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I force Maven to use Ehcache 2.2.0 with Hibernate 3.3.2GA?

Assuming that the two are compatible, how can I force Maven 2 to use Ehcache 2.2.0 instead of Ehcache 1.2.3 with Hibernate 3.3.2.GA?

Essentially, I wish to replace the puzzling and practically cyclic dependency chain

  • Hibernate Ehcache Integration 3.3.2.GA => Ehcache 1.2.3 => Hibernate 3.2.0.cr3 => Ehcache 1.2

with

  • Hibernate Ehcache Integration 3.3.2.GA => Ehcache 2.2.0

Update:

I learned that hibernate-commons-annotations-3.3.0.ga also depends on artifact ehcache-1.2.3:

[INFO] +- org.hibernate:hibernate-commons-annotations:jar:3.3.0.ga:compile
[INFO] |  +- org.hibernate:hibernate:jar:3.2.1.ga:compile
[INFO] |  |  +- net.sf.ehcache:ehcache:jar:1.2.3:compile
[INFO] |  |  +- asm:asm-attrs:jar:1.5.3:compile
[INFO] |  |  +- cglib:cglib:jar:2.1_3:compile
[INFO] |  |  \- asm:asm:jar:1.5.3:compile
[INFO] |  \- javax.persistence:persistence-api:jar:1.0:compile

What is the purpose of hibernate-commons-annotations-3.3.0.ga? Does Hibernate need this artifact if it uses hibernate-annotations-3.2.1-ga? Is there a replacement for this artifact that doesn't include Ehcache? Should I simply try to exclude it from the build?

like image 943
Derek Mahar Avatar asked Aug 24 '10 21:08

Derek Mahar


1 Answers

Assuming that the two are compatible, how can I force Maven 2 to use Hibernate 3.3.2.GA with Ehcache 2.2.0? According to their respective Maven POM files:

I've investigated this question for my personal needs and I have now concrete answers. All the required informations are available online and I'm just posting a very short version of howto use Ehcache 2.x with Hibernate 3.3+.

First, you need to declare the dependency on the ehcache artifact.

<dependency>
  <groupId>net.sf.ehcache</groupId>
  <artifactId>ehcache</artifactId>
  <version>2.2.0</version>
  <type>pom</type>
</dependency>

Then, configure Hibernate for second level caching and specify the second level cache provider:

<property key="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.region.factory_class">net.sf.ehcache.hibernate.EhCacheRegionFactory</property>

Important things to note:

  • we are using the property for the new Hibernate 3.3/3.5 SPI (that Ehcache 2.0+ supports)
    • hibernate.cache.region.factory_class
  • we are using the cache provider provided by Echache
    • net.sf.ehcache.hibernate.EhCacheRegionFactory (and not o.h.c.EhCacheProvider)

So you actually just don't need the hibernate-ehcache artifact - and this solves the entire question :) Here are the exact (relevant) dependencies I use:

<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-entitymanager</artifactId>
  <version>3.4.0.GA</version>
</dependency>
<dependency>
  <groupId>net.sf.ehcache</groupId>
  <artifactId>ehcache</artifactId>
  <version>2.2.0</version>
  <type>pom</type>
</dependency>

And the tree:

[INFO] +- org.hibernate:hibernate-entitymanager:jar:3.4.0.GA:compile
[INFO] |  +- org.hibernate:ejb3-persistence:jar:1.0.2.GA:compile
[INFO] |  +- org.hibernate:hibernate-commons-annotations:jar:3.1.0.GA:compile
[INFO] |  +- org.hibernate:hibernate-annotations:jar:3.4.0.GA:compile
[INFO] |  +- org.hibernate:hibernate-core:jar:3.3.0.SP1:compile
[INFO] |  |  +- antlr:antlr:jar:2.7.6:compile
[INFO] |  |  \- commons-collections:commons-collections:jar:3.1:compile
[INFO] |  +- org.slf4j:slf4j-api:jar:1.5.10:compile
[INFO] |  +- dom4j:dom4j:jar:1.6.1:compile
[INFO] |  |  \- xml-apis:xml-apis:jar:1.0.b2:compile
[INFO] |  +- javax.transaction:jta:jar:1.1:compile
[INFO] |  \- javassist:javassist:jar:3.4.GA:compile
[INFO] +- ch.qos.logback:logback-classic:jar:0.9.18:compile
[INFO] |  \- ch.qos.logback:logback-core:jar:0.9.18:compile
[INFO] \- net.sf.ehcache:ehcache:pom:2.2.0:compile
[INFO]    +- net.sf.ehcache:ehcache-core:jar:2.2.0:compile
[INFO]    +- net.sf.ehcache:ehcache-terracotta:jar:2.2.0:compile
[INFO]    \- org.terracotta:terracotta-toolkit-1.0-runtime:jar:1.0.0:compile

For more details, ehcache configuration samples, official documentation, refer to the links below.

Resources

  • Ehcache 2.0 supports new Hibernate 3.3 caching provider
  • Configure Ehcache as a Second Level Cache
  • Hibernate Second Level Cache
  • Upgrading From Ehcache versions prior to 2.0
like image 191
Pascal Thivent Avatar answered Nov 16 '22 00:11

Pascal Thivent