2012-08-10 12 views
19

कॉन्फ़िगर करना मैं ehcache (v2.6.0) को Hibernate 4.1.5.SP1 प्रोजेक्ट में जोड़ने की कोशिश कर रहा हूं, लेकिन कुछ कॉन्फ़िगरेशन समस्याएं हैं। org/hibernate/cache/EntityRegion त्रुटि जब मैं कोशिश करते हैं औरjava.lang.NoClassDefFoundError: org/hibernate/cache/EntityRegion EHCache

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

यहाँ के साथ मेरी Hibernate विन्यास का निर्माण कर रहा है यहाँ जावा कोड मैं करने के लिए उपयोग कर रहा है मेरी 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.lang.NoClassDefFoundError हो रही है इसे कॉन्फ़िगर करें ...

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 

उत्तर

34

ehcache-core फ़ाइलें मूल रूप से हाइबरनेट 3.x के लिए हैं। हाइबरनेट 4.x ehcache के लिए अपने स्वयं के कार्यान्वयन के साथ आता है। आपको ehcache को स्पष्ट रूप से हाइबरनेट 4x में उपयोग करने की आवश्यकता नहीं है। आपकी समस्या का सबसे अच्छा जवाब यहां दिया गया है।

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

+1

इस दृष्टिकोण के साथ समस्या (hibernate- का उपयोग कर ehcache-core की बजाय ehcache निर्भरता) यह है: इस टिप्पणी को लिखने के समय के रूप में, हाइबरनेट-एहैचे (4.2.0.CR2) का नवीनतम संस्करण संस्करण 2.4.3 में ehcache-core पर निर्भर करता है [mvnrepo sitory.com] (http://mvnrepository.com/artifact/org.hibernate/hibernate-ehcache/4.2.0.CR2)। यह अपवाद पैदा कर रहा है जैसे "एलिमेंट विशेषता नहीं देता है" maxEntriesLocalHeap ", क्योंकि यह विशेषता (इसी तरह नए आंतरिक तत्वों, जिन्हें आप अपनी ehcache.xml फ़ाइल में परिभाषित करते हैं) हाल ही में Ehcache (2.6.x) में जोड़ा गया है। – Mariusz

+0

वर्कअराउंड आपके पोम में हाइबरनेट-एहैशे से ehcache-core transitive निर्भरता को बाहर करना है और इसके बजाय Ehcache पर ver 2.6.x निर्भरता जोड़ें। – Mariusz

+5

उत्तर वाला पृष्ठ 404 देता है, इस प्रकार यह उत्तर अब मान्य नहीं है। – Gorkamorka

3

मैं Maven निर्भरता की जाँच की। हाइबरनेट-एहैच पैकेज लोड होने पर मैवेन हमेशा एशैच-कोड लोड करता है।

निर्भरता पेड़:

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

हाइबरनेट 4 से, कैशिंग के लिए नया हाइबरनेट-कैश परिचय है। इसे 2.6 तक net.sf.ehcache के लिए नवीनतम निर्भरता की आवश्यकता है। निम्नलिखित लेख CLICK ON LINK होगा। जब मैं अपने पोम में निर्भरता निम्नलिखित जोड़ने के लिए, त्रुटि निकाल देगा:

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

हाइबरनेट 4 के लिए, का उपयोग

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

Hibernate Configuration Article

संबंधित मुद्दे