2012-08-10 13 views
19

Ich versuche, ehcache (v2.6.0) zu meinem Projekt Hibernate 4.1.5.SP1 hinzufügen, aber einige Konfigurationsprobleme. Genauer gesagt, ich bin immer ein java.lang.NoClassDefFoundError: org/hibernate/cache/EntityRegion Fehler, wenn ich mitjava.lang.NoClassDefFoundError: org/Ruhezustand/Cache/EntityRegion Konfiguration EHCache

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

meine Hibernate Konfiguration versuchen und bauen hier ist meine Maven Abhängigkeiten ...

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

Hier ist der Java Code, den ich verwenden, um konfiguriere es ...

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

und hier ist der scheußliche Fehler. Welche Konfiguration fehlt mir?

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 

Antwort

34

ehcache-core Dateien sind grundsätzlich für Hibernate 3.x. Hibernate 4.x kommt mit einer eigenen Implementierung für ehcache. Sie müssen ehcache im Hibernate 4.x nicht explizit verwenden. Hier ist die beste Antwort für Ihr Problem.

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

+1

Das Problem bei diesem Ansatz (mit hibernate ehcache dependency statt ehcache-core) ist das: Zum Zeitpunkt des Schreibens dieses Kommentars ist die neueste Version von hibernate-ehcache (4.2.0.CR2) abhängig von ehcache-core in Version 2.4.3 nach [mvnrepo sitory.com] (http://mvnrepository.com/artifact/org.hibernate/hibernate-ehcache/4.2.0.CR2). Dies verursacht eine Ausnahme wie "Element erlaubt Attribut" maxEntriesLocalHeap "nicht, weil dieses Attribut (ähnlich wie neue innere Elemente , die Sie in Ihrer Datei ehcache.xml definieren) erst kürzlich in Ehcache (2.6.x) hinzugefügt wurde. – Mariusz

+0

Die Problemumgehung besteht darin, Ehcache-Core transitive Abhängigkeit von Hibernate-ehcache in Ihrem Pom auszuschließen und Ver 2.6.x-Abhängigkeit stattdessen auf Ehcache hinzuzufügen. – Mariusz

+5

Die Seite mit der Antwort gibt eine 404, daher ist diese Antwort nicht mehr gültig. – Gorkamorka

3

checkte ich Maven die Abhängigkeiten. Maven lädt immer ehcache-code, wenn das hibernate-ehcache-Paket geladen wird.

Abhängigkeitsbaum:

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

Bitte überprüfen Sie Ihre Ausdauer-Konfiguration. Es sollte keine Klassen enthält, in dem der Paketname mit „net.sf“ beginnt

Zum Beispiel haben Sie die folgende Zeichenfolge in Ihrem Code ersetzen:

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

mit der folgenden Zeichenfolge:

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

Aus Hibernate 4, gibt es einen neuen Hibernate-Cache zum Zwischenspeichern einführen. Dies benötigt die letzte Abhängigkeit für net.sf.ehcache bis zu 2,6. Der folgende Artikel wird CLICK ON LINK. Wenn ich folgende Abhängigkeit in meinem pom hinzufügen, wird der Fehler entfernen:

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

Für Hibernate 4 verwendet

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

Hibernate Configuration Article