java.lang.NoClassDefFoundError:org / hibernate / cache / EntityRegion配置EHCache

我正在尝试将ehcache (v2.6.0)添加到我的Hibernate 4.1.5.SP1项目中,但有一些配置问题。 具体来说,当我尝试构建我的Hibernate配置时,我收到了java.lang.NoClassDefFoundErrororg/hibernate/cache/EntityRegion错误

  true net.sf.ehcache.hibernate.EhCacheRegionFactory 

这是我的Maven依赖…

  4.1.5.SP1 4.3.0.Final 2.6.0 ...   org.hibernate hibernate-validator ${hibernate.validator.version}   org.hibernate hibernate-entitymanager ${hibernate.version}   net.sf.ehcache ehcache-core ${ehcacheVersion}  

这是我用来配置它的Java代码……

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

这是可怕的错误。 我错过了什么配置?

 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 

ehcache-core文件基本上适用于Hibernate 3.x. Hibernate 4.x附带了自己的ehcache实现。 您不需要在hibernate 4.x中显式使用ehcache。 这是您问题的最佳答案。

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

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

对于Hibernate 4,请使用

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

Hibernate配置文章

我检查了maven的依赖项。 当加载hibernate-ehcache包时,Maven总是加载ehcache-code。

依赖树:

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

请检查您的持久性配置。 它不应该包含包名称以“net.sf”开头的任何类

例如,您必须在代码中替换以下字符串:

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

使用以下字符串:

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

从Hibernate 4开始,新的hibernate-cache引入了缓存。 这需要net.sf.ehcache最新依赖为2.6。 以下文章将点击链接 。 当我在我的pom中添加以下依赖项时,错误将删除:

   net.sf.ehcache ehcache 2.8.3