2017-09-16 4 views
7

मैं हाइबरनेट 5 (5.2.11) एक साथ उपयोग करने के लिए स्प्रिंग ORM के साथ कोशिश कर रहा हूँ: persister खोजने में असमर्थ।org.hibernate.UnknownEntityTypeException: entity.Settings

बाद ट्यूटोरियल मैं निम्नलिखित विन्यास के साथ आया था:

स्प्रिंग बीन

<bean id="sessionFactorySettings" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop> 
      <prop key="hibernate.connection.driver_class">org.h2.Driver</prop> 
      <prop key="hibernate.connection.url">jdbc:h2:~/.dummy/settings</prop> 
      <prop key="hibernate.show_sql">true</prop> 
      <prop key="hibernate.hbm2ddl.auto">update</prop> 
     </props> 
    </property> 
    <property name="mappingResources"> 
     <list> 
      <value>/hibernate.cfg.xml</value> 
     </list> 
    </property> 
</bean> 

हाइबरनेट (hibernate.cfg.xml)

<?xml version='1.0' encoding='utf-8'?> 
<!DOCTYPE hibernate-configuration PUBLIC 
     "-//Hibernate/Hibernate Configuration DTD//EN" 
     "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
    <session-factory> 
     <mapping class="entity.Settings"/> 
    </session-factory> 
</hibernate-configuration> 

यह विन्यास एक की ओर जाता है org.hibernate.UnknownEntityTypeException: Unable to locate persister: entity.Settings

हालांकि, जैसे ही मैंने hibernate.cfg.xml में सभी

<prop key="hibernate.xxx">..</prob> 

गुण के लिए कदम है और मैं करने के लिए

<bean id="sessionFactorySettings" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> 
     <property name="configLocation" value="/hibernate.cfg.xml"/> 
</bean> 

सब कुछ वसंत विन्यास बदल ठीक काम करता है।

कोई विचार क्या मैं गलत करता हूं?

पुनश्च: निर्भरता:

dependencies { 
    compile 'ch.qos.logback:logback-classic:1.2.3' 
    compile 'org.springframework:spring-context:4.3.11.RELEASE' 
    compile 'org.springframework:spring-jdbc:4.3.11.RELEASE' 
    compile 'org.springframework:spring-orm:4.3.11.RELEASE' 
    compile 'org.hibernate:hibernate-core:5.2.11.Final' 
    compile 'org.hibernate:hibernate-java8:5.2.11.Final' 
    compile 'org.apache.commons:commons-dbcp2:2.1.1' 
    compile 'com.h2database:h2:1.4.196' 
} 
+1

मैंने आपके द्वारा लिखे गए कॉन्फ़िगरेशन को कभी नहीं देखा। मैं हमेशा इस्तेमाल या हाइबरनेट सीएफजी फ़ाइल या वसंत हाइबरनेट कॉन्फ़िगरेशन। क्या आपने वसंत विन्यास के अंदर इकाई वर्ग सूची डालने का प्रयास किया था? –

+0

मैंने सोचा कि इकाई वर्ग बसंत विन्यास के अंदर होना चाहिए। पर कैसे? – Hannes

उत्तर

2

जब मैं हाइबरनेट और स्प्रिंग का उपयोग मैं आमतौर पर इस प्रकार का कॉन्फ़िगरेशन का उपयोग करें:

<bean id="hibernateSessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="hibernateDatasource" /> 
    <!-- HERE YOU HAVE TO PUT THE PACKAGE 
     WHERE YOUR ENTITY CLASS ARE LOCATED 
     (I mean classes annotated with @Entity annotation --> 
    <property name="packagesToScan" value="hibernate.models" /> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect"> 
       ${hibernate.props.db.dialect} 
      </prop> 
      <prop key="hibernate.show_sql"> 
       ${hibernate.props.db.show.sql} 
      </prop> 
      <prop key="hibernate.generate_statistics"> 
       ${hibernate.props.db.generate.statistics} 
      </prop> 
      <prop key="hibernate.format_sql"> 
       ${hibernate.props.db.format.sql} 
      </prop> 
      <prop key="hibernate.hbm2ddl.auto"> 
       ${hibernate.props.db.ddl.instr} 
      </prop> 
      <prop key="hibernate.cache.use_second_level_cache">${hibernate.props.db.use.cache}</prop> 
      <prop key="hibernate.cache.use_query_cache">${hibernate.props.db.use.query.cache}</prop> 
      <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory 
      </prop> 
      <prop key="net.sf.ehcache.configurationResourceName">hibernateEhCacheCfg.xml</prop> 
      <prop key="hibernate.jdbc.batch_size">${hibernate.props.db.jdbc.batch.size}</prop> 
      <prop key="hibernate.jdbc.use_streams_for_binary">true</prop> 
     </props> 
    </property> 
</bean> 

मेरे सभी गुण हैं, तो, एक संपत्ति फ़ाइल

का उपयोग करके लोड

मुझे उम्मीद है कि यह उपयोगी है

एंजेलो

2

स्प्रिंग डॉक्स के अनुसार, LocalSessionFactoryBean#setMappingResources विधि HBM मानचित्रण फ़ाइलें, नहीं हाइबरनेट विन्यास फाइल प्रदान करने के लिए इस्तेमाल किया जाना चाहिए (उदाहरण के लिए hibernate.cfg.xml)।

यही कारण है कि यह काम नहीं करता है। हालांकि, जैसे ही आप configLocation संपत्ति का उपयोग करते हैं, यह काम करता है क्योंकि यह हाइबरनेट-विशिष्ट कॉन्फ़िगरेशन फ़ाइल प्रदान करने का इच्छित तरीका है।

अब, जब से तुम शायद व्याख्या का उपयोग, आप बिल्कुल setMappingResources उपयोग करने की आवश्यकता नहीं है। यह केवल तभी जरूरी है जब आप XML_based एचबीएम फ़ाइलों का उपयोग हाइबरनेट मैपिंग प्रदान करने के लिए करना चाहते हैं।

आपको क्या चाहिए LocalSessionFactoryBean#setAnnotatedClasses बजाय है। या setPackagesToScan जो आपको केवल entities फ़ोल्डर देने और अंदर के सभी इकाई वर्गों को पंजीकृत करने की अनुमति देता है। बाहर my book, High-Performance Java Persistence, GitHub repository अधिक जानकारी के लिए

चेक।

+0

मैं एनोटेशन का उपयोग करता हूं लेकिन मैंने सोचा कि मुझे अभी भी कक्षाओं को कहीं पंजीकृत करने की आवश्यकता है? अगर मैं हाइबरनेट के लिए किसी भी कॉन्फ़िगरेशन का उपयोग नहीं करता हूं तो यह भी काम नहीं करेगा ... – Hannes

+0

जैसा कि मैंने अपने उत्तर में बताया है, 'setAnnotatedClasses' का उपयोग करें। –