web-dev-qa-db-ja.com

java.lang.NoClassDefFoundError:org / hibernate / cache / EntityRegion構成EHCache

Hibernate 4.1.5.SP1プロジェクトにehcache(v2.6.0)を追加しようとしていますが、いくつかの構成上の問題があります。具体的には、Hibernate構成を使用してビルドしようとすると、Java.lang.NoClassDefFoundErrororg/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
21
Dave A

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

35
Tapas

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")
5
Max
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設定記事

3
Thiago Emanuel

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