Hibernate 4.1.5.SP1
プロジェクトにehcache
(v2.6.0)を追加しようとしていますが、いくつかの構成上の問題があります。具体的には、Hibernate
構成を使用してビルドしようとすると、Java.lang.NoClassDefFoundError
:org/hibernate/cache/EntityRegion
エラーが発生します。
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.region.factory_class">net.sf.ehcache.hibernate.EhCacheRegionFactory</property>
これが私のMaven依存関係です...
<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>
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を明示的に使用する必要はありません。ここにあなたの問題に対する最良の答えがあります。
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")
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 4から、キャッシュ用の新しいhibernate-cacheが導入されました。これには、net.sf.ehcache
2.6までの最新の依存関係が必要です。次の記事は リンクをクリック です。私のPOMに次の依存関係を追加すると、エラーが削除されます:
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>2.8.3</version>
</dependency>