2011-11-08 8 views
9

मैं JPA EntityManagerFactory bootstrapping without persistence.xml का उपयोग करने की कोशिश कर रहा हूं, जो वसंत 3.1 (एम 2 के बाद से) में नया है, लेकिन ऐसा लगता है कि वसंत अभी भी persistence.xml फ़ाइल की खोज कर रहा है , इस तथ्य के बावजूद कि packagesToScan निर्दिष्ट है।स्प्रिंग 3.1 बिना persistence.xml "दृढ़ता इकाई रूट यूआरएल को हल करने में असमर्थ"

context.xml में, entityManagerFactory thusly कॉन्फ़िगर किया गया है:

<bean id="my-persistence-unit" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="persistenceProviderClass" 
     value="org.hibernate.ejb.HibernatePersistence"/> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/> 
    </property> 
    <property name="jpaProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop> 
     </props> 
    </property> 
    <property name="packagesToScan"> 
     <list> 
      <value>my.package.name</value> 
     </list> 
    </property> 
</bean> 

लेकिन आवेदन स्टार्टअप पर, संदेश के साथ एक PersistenceException "हठ इकाई जड़ URL का समाधान करने में असमर्थ" होती है:

... 
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'my-persistence-unit' defined in class path resource [META-INF/context.xml]: 
... 
Caused by: javax.persistence.PersistenceException: Unable to resolve persistence unit root URL 
     at org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.determineDefaultPersistenceUnitRootUrl(DefaultPersistenceUnitManager.java:429) 
     at org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.preparePersistenceUnitInfos(DefaultPersistenceUnitManager.java:327) 
     at org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.afterPropertiesSet(DefaultPersistenceUnitManager.java:309) 
     at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:209) 
     at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:310) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1504) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1442) 
     ... 34 more 
Caused by: java.io.FileNotFoundException: class path resource [] cannot be resolved to URL because it does not exist 
     at org.springframework.core.io.ClassPathResource.getURL(ClassPathResource.java:179) 
     at org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.determineDefaultPersistenceUnitRootUrl(DefaultPersistenceUnitManager.java:426) 
     ... 40 more 

से पहले मैं packagesToScan कहा, मैं एक न्यूनतम persistence.xml था, और persistenceXmlLocation निर्धारित करते हैं, जैसे इतना:

<property name="persistenceXmlLocation" 
    value="classpath:META-INF/persistence.xml"/> 

जो ठीक काम किया। तो अब मैं गलत तरीके से क्या कर रहा हूँ?

संपादितjpaVendorAdapter कहा, त्रुटि बनी हुई है।

संपादित करें हटाए गए टिप्पणी के अनुसार निरंतरता UnitName; हठ इकाई का नाम (@PersistenceContext के लिए)

अद्यतन इस त्रुटि के लिए नाम बदला बीन्स निर्भर करने के लिए जिस पर आवेदन संदर्भ लोडर की तरह प्रयोग किया जाता है लगता है। कोड @ContextConfiguration के माध्यम से एक वसंत/जूनिट परीक्षण में काम करता है, लेकिन ClassPathXmlApplicationContext

उत्तर

9

के माध्यम से proframatically ईएमएफ कॉन्फ़िगर यह वसंत, मैं reported it में एक बग है यह बताने के लिए अनुमति देते हैं।

ध्यान दें कि यह केवल एक पैक आवेदन के लिए होता है, जब सभी classpath आइटम जार कर रहे हैं। यही कारण है कि यह यूनिट परीक्षणों में विफल नहीं होता है।

+0

इसे हटाने से कोई फर्क नहीं पड़ता; एक ही त्रुटि – beerbajay

+0

@bebbayay: अपडेट किया गया। – axtavt

+0

ग्रेट, मुझे लगता है कि मैं अपना न्यूनतम दृढ़ता रखूंगा।अब के लिए एक्सएमएल देखें और देखें कि वे बग रिपोर्ट का जवाब कैसे देते हैं। – beerbajay

0

मुझे नहीं लगता कि यह वर्ग आपको persistence.xml फ़ाइल को पूरी तरह से हटाने की अनुमति देता है। इसके जावाडोक से:

"हालांकि, यह फैक्ट्रीबीन अधिक लचीला है कि आप persistence.xml फ़ाइल के स्थान को ओवरराइड कर सकते हैं, जेडीबीसी डेटा स्रोतों को लिंक करने के लिए निर्दिष्ट करें।"

मुझे लगता है कि यह करता है आप एक न्यूनतम persistence.xml फ़ाइल है और उसके बाद आप आगे श्रोताओं आदि

+1

सच? डॉक मैं जुड़ा हुआ कहते हैं – beerbajay

+2

इसके अलावा "प्रभावी रूप से, इस इकाई स्कैनिंग के लिए एक आधार पैकेज को निर्दिष्ट करने की मात्र के खर्च पर एक्सएमएल मुक्त जेपीए सेटअप के लिए अनुमति देता है" "स्प्रिंग आधारित स्कैनिंग के मामले में, कोई persistence.xml आवश्यक है," http://static.springsource.org/spring/docs/3.1.0.RC1/javadoc-api/org/springframework/orm/jpa/LocalContainerEntityManagerFactoryBean.html#setPackagesToScan%28java.lang.String...%29 – beerbajay

+0

से वैसे आपने उस व्यक्ति के कोड को गलत कॉपी किया है। इसकी: <संपत्ति का नाम = "jpaPropertyMap"> नहीं <संपत्ति का नाम = "jpaProperties">। और आपको को भी जोड़ना होगा। –

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