web-dev-qa-db-fra.com

java.lang.NoClassDefFoundError: org / hibernate / cache / EntityRegion configurant EHCache

J'essaie d'ajouter ehcache (v2.6.0) à mon Hibernate 4.1.5.SP1 projet, mais ayant quelques problèmes de configuration. Plus précisément, je reçois un Java.lang.NoClassDefFoundError: org/hibernate/cache/EntityRegion erreur lorsque j'essaye de créer ma configuration Hibernate avec

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

Voici mes Maven dépendances ...

    <hibernate.version>4.1.5.SP1</hibernate.version>
    <hibernate.validator.version>4.3.0.Final</hibernate.validator.version>
    <ehcacheVersion>2.6.0</ehcacheVersion>
    ...
    <!-- Hibernate dependencies -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>${hibernate.validator.version}</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>${hibernate.version}</version>
    </dependency>
    <dependency>
        <groupId>net.sf.ehcache</groupId>
        <artifactId>ehcache-core</artifactId>
        <version>${ehcacheVersion}</version>
    </dependency>

Voici le code Java que j'utilise pour le configurer ...

    Configuration config = new Configuration()
        .setProperty("hibernate.dialect", "org.hibernate.dialect.HSQLDialect")
        .setProperty("hibernate.connection.driver_class", "org.hsqldb.jdbcDriver")
        .setProperty("hibernate.connection.url", "jdbc:hsqldb:mem:myprojectTestDb")
        .setProperty("hibernate.connection.username", "sa")
        .setProperty("hibernate.connection.password", "")
        .setProperty("hibernate.connection.pool_size", "1")
        .setProperty("hibernate.connection.autocommit", "true")
        .setProperty("hibernate.cache.provider_class", "org.hibernate.cache.HashtableCacheProvider")
        .setProperty("hibernate.hbm2ddl.auto", "create-drop")
        .setProperty("hibernate.show_sql", "true")
        .setProperty("hibernate.current_session_context_class", "thread")
        .setProperty("hibernate.cache.use_second_level_cache", "true")
        .setProperty("hibernate.cache.region.factory_class", "net.sf.ehcache.hibernate.EhCacheRegionFactory")
        .addAnnotatedClass(Organization.class)
        .addAnnotatedClass(State.class) 
        .addAnnotatedClass(Country.class)
        .addAnnotatedClass(Domain.class)
        .addAnnotatedClass(Community.class);
    final ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
    sessionFactory = config.buildSessionFactory(serviceRegistry);

et voici l'erreur hideuse. Quelle configuration me manque?

Java.lang.NoClassDefFoundError: org/hibernate/cache/EntityRegion
    at Java.lang.Class.getDeclaredConstructors0(Native Method)
    at Java.lang.Class.privateGetDeclaredConstructors(Unknown Source)
    at Java.lang.Class.getConstructor0(Unknown Source)
    at Java.lang.Class.getConstructor(Unknown Source)
    at org.hibernate.cfg.SettingsFactory.createRegionFactory(SettingsFactory.Java:386)
    at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.Java:251)
    at org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.Java:2270)
    at org.hibernate.cfg.Configuration.buildSettings(Configuration.Java:2266)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.Java:1735)
    at org.mainco.subco.orgsclient.service.OrganizationServiceTest.setupOrgServiceTest(OrganizationServiceTest.Java:56)
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at Java.lang.reflect.Method.invoke(Unknown Source)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.Java:44)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.Java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.Java:41)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.Java:27)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.Java:76)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.Java:50)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.Java:193)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.Java:52)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.Java:191)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.Java:42)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.Java:184)
    at org.junit.runners.ParentRunner.run(ParentRunner.Java:236)
    at org.Eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.Java:50)
    at org.Eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.Java:38)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.Java:467)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.Java:683)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.Java:390)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.Java:197)
Caused by: Java.lang.ClassNotFoundException: org.hibernate.cache.EntityRegion
    at Java.net.URLClassLoader$1.run(Unknown Source)
    at Java.security.AccessController.doPrivileged(Native Method)
    at Java.net.URLClassLoader.findClass(Unknown Source)
    at Java.lang.ClassLoader.loadClass(Unknown Source)
    at Sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at Java.lang.ClassLoader.loadClass(Unknown Source)
    ... 32 more
21
Dave A

les fichiers ehcache-core sont essentiellement pour Hibernate 3.x. Hibernate 4.x est livré avec sa propre implémentation pour ehcache. Vous n'avez pas besoin d'utiliser explicitement ehcache dans hibernate 4.x. Voici la meilleure réponse à votre problème.

http://web.archive.org/web/20130117102553/http://www.javacraft.org/2012/03/migrate-to-hibernate-4-ehcache.html

36
Tapas

J'ai vérifié maven les dépendances. Maven charge toujours le code ehcache lorsque le package hibernate-ehcache est chargé.

Arbre de dépendance:

+--- org.hibernate:hibernate-ehcache:4.3.0.Final
|    +--- org.jboss.logging:jboss-logging:3.1.3.GA
|    +--- org.jboss.logging:jboss-logging-annotations:1.2.0.Beta1
|    +--- org.hibernate:hibernate-core:4.3.0.Final (*)
|    \--- net.sf.ehcache:ehcache-core:2.4.3
|         \--- org.slf4j:slf4j-api:1.6.1 -> 1.6.6

Veuillez vérifier votre configuration de persistance. Il ne doit pas inclure de classes où le nom du package commence par "net.sf"

Par exemple, vous devez remplacer la chaîne suivante dans votre code:

.setProperty("hibernate.cache.region.factory_class", "net.sf.ehcache.hibernate.EhCacheRegionFactory")

avec la chaîne suivante:

.setProperty("hibernate.cache.region.factory_class", "org.hibernate.cache.ehcache.EhCacheRegionFactory")
5
Max
Configuration.setProperty("hibernate.cache.region.factory_class", 
                     "net.sf.ehcache.hibernate.EhCacheRegionFactory")

Pour Hibernate 4, utilisez

org.hibernate.cache.ehcache.EhCacheRegionFactory instead of net.sf.ehcache.hibernate.EhCacheRegionFactory

Hibernate Configuration Article

3
Thiago Emanuel

Depuis Hibernate 4, un nouveau cache hibernate est introduit pour la mise en cache. Cela nécessite la dernière dépendance pour net.sf.ehcache jusqu'à 2.6. L'article suivant sera CLIQUEZ SUR LE LIEN . Lorsque j'ajoute la dépendance suivante dans mon pom, l'erreur supprimera:

    <dependency>
        <groupId>net.sf.ehcache</groupId>
        <artifactId>ehcache</artifactId>
        <version>2.8.3</version>
    </dependency>
1
Harmeet Singh Taara