2012-08-10 24 views
19

Estoy intentando agregar ehcache (v2.6.0) a mi proyecto Hibernate 4.1.5.SP1, pero tengo algunos problemas de configuración. En concreto, me estoy poniendo un java.lang.NoClassDefFoundError: error org/hibernate/cache/EntityRegion cuando intento construir mi configuración Hibernate conjava.lang.NoClassDefFoundError: org/hibernate/cache/EntityRegion configurando EHCache

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

Aquí está mi Maven dependencias ...

<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> 

Aquí está el código Java que utilizo para configúrelo ...

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); 

y aquí está el horrible error. ¿Qué configuración me falta?

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 

Respuesta

34

Los archivos ehcache-core son básicamente para Hibernate 3.x. Hibernate 4.x viene con su propia implementación para ehcache. No necesita usar ehcache explícitamente en hibernate 4.x. Aquí está la mejor respuesta para su problema.

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

+1

El problema con este enfoque (utilizando hibernate dependencia de ehcache en lugar de ehcache-core) es esta: en el momento de escribir este comentario, la versión más reciente de hibernate-ehcache (4.2.0.CR2) depende de ehcache-core en la versión 2.4.3 de acuerdo con [mvnrepo sitory.com] (http://mvnrepository.com/artifact/org.hibernate/hibernate-ehcache/4.2.0.CR2). Esto está causando una excepción como "El elemento no permite el atributo" maxEntriesLocalHeap ", porque este atributo (de manera similar a los nuevos elementos internos que usted define en su archivo ehcache.xml) se ha agregado recientemente en Ehcache (2.6.x). – Mariusz

+0

La solución consiste en excluir la dependencia transitiva ehcache-core de hibernate-ehcache en su pom y agregar la dependencia de ver 2.6.x en Ehcache. – Mariusz

+5

La página con la respuesta da un 404, por lo que esta respuesta ya no es válida. – Gorkamorka

3

he comprobado experta en las dependencias. Maven siempre carga ehcache-code cuando se carga el paquete hibernate-ehcache.

Dependencia árbol:

+--- 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 

Por favor, compruebe la configuración de la persistencia. No debe incluir ningún clases en que el nombre del paquete comienza con "net.sf"

Por ejemplo, usted tiene que reemplazar la cadena siguiente en el código:

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

con la siguiente cadena:

.setProperty("hibernate.cache.region.factory_class", "org.hibernate.cache.ehcache.EhCacheRegionFactory") 
1

Desde Hibernate 4, hay una nueva memoria caché de hibernación para el almacenamiento en caché. Esto necesita la última dependencia para net.sf.ehcache hasta 2.6. El siguiente artículo será CLICK ON LINK. cuando agrego siguiente dependencia en mi pom, el error se eliminará:

<dependency> 
     <groupId>net.sf.ehcache</groupId> 
     <artifactId>ehcache</artifactId> 
     <version>2.8.3</version> 
    </dependency> 
1
Configuration.setProperty("hibernate.cache.region.factory_class", 
        "net.sf.ehcache.hibernate.EhCacheRegionFactory") 

Para Hibernate 4, utilice

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

Hibernate Configuration Article

Cuestiones relacionadas