2012-01-13 16 views
7

मैं अपने सभी डीएओ JdoDaoSupport वर्ग का विस्तार करता था जो अब deprecated in Spring 3.1 है। मैंने अपना खुद का AbstractJdoDao वर्ग बनाया है जो PersistenceManagerFactory को लपेटता है और सभी डीएओ वहां से विस्तारित होते हैं। क्या मुझे ऐसा करना चाहिए?वसंत 3.1 में जेडीओ को कॉन्फ़िगर करना?

इसके अलावा documentation on JDO में, ऐसा लगता है कि PersistenceManagerFactory के प्रत्यक्ष इन्स्टेन्शियशन डिफ़ॉल्ट विकल्प नहीं है, लेकिन LocalPersistenceManagerFactoryBean एक TransactionAwarePersistenceManagerFactoryProxy में लिपटे उपयोग करने के लिए। इन बीन्स को ठीक से कैसे ठीक करें और उन्हें वसंत के @Transactional एनोटेशन के साथ कैसे काम करें।

org.springframework.transaction.CannotCreateTransactionException: Could not open JDO PersistenceManager for transaction; nested exception is java.lang.IllegalStateException: No JDO PersistenceManager bound to thread, and configuration does not allow creation of non-transactional one here 
    at org.springframework.orm.jdo.JdoTransactionManager.doBegin(JdoTransactionManager.java:369) ~[spring-orm-3.1.0.RELEASE.jar:3.1.0.RELEASE] 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:371) ~[spring-tx-3.1.0.RELEASE.jar:3.1.0.RELEASE] 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:335) ~[spring-tx-3.1.0.RELEASE.jar:3.1.0.RELEASE] 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:105) ~[spring-tx-3.1.0.RELEASE.jar:3.1.0.RELEASE] 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) ~[spring-aop-3.1.0.RELEASE.jar:3.1.0.RELEASE] 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) ~[spring-aop-3.1.0.RELEASE.jar:3.1.0.RELEASE] 
    at $Proxy15.queryAll(Unknown Source) ~[na:na] 
    ... 
Caused by: java.lang.IllegalStateException: No JDO PersistenceManager bound to thread, and configuration does not allow creation of non-transactional one here 
    at org.springframework.orm.jdo.PersistenceManagerFactoryUtils.doGetPersistenceManager(PersistenceManagerFactoryUtils.java:153) ~[spring-orm-3.1.0.RELEASE.jar:3.1.0.RELEASE] 
    at org.springframework.orm.jdo.TransactionAwarePersistenceManagerFactoryProxy$PersistenceManagerFactoryInvocationHandler.invoke(TransactionAwarePersistenceManagerFactoryProxy.java:159) ~[spring-orm-3.1.0.RELEASE.jar:3.1.0.RELEASE] 
    at $Proxy13.getPersistenceManager(Unknown Source) ~[na:na] 
    at org.springframework.orm.jdo.JdoTransactionManager.doBegin(JdoTransactionManager.java:308) ~[spring-orm-3.1.0.RELEASE.jar:3.1.0.RELEASE] 
... 73 common frames omitted 

मैं my example project on GitHub मिल गया है:

<bean id="persistenceManagerFactoryProxy" class="org.springframework.orm.jdo.TransactionAwarePersistenceManagerFactoryProxy"> 
    <property name="targetPersistenceManagerFactory"> 
     <bean class="org.springframework.orm.jdo.LocalPersistenceManagerFactoryBean"> 
      <property name="jdoPropertyMap"> 
       <props> 
        <prop key="javax.jdo.PersistenceManagerFactoryClass">org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManagerFactory</prop> 
        <prop key="javax.jdo.option.ConnectionURL">appengine</prop> 
        <prop key="javax.jdo.option.NontransactionalRead">true</prop> 
        <prop key="javax.jdo.option.NontransactionalWrite">false</prop> 
        <prop key="javax.jdo.option.RetainValues">false</prop> 
        <prop key="javax.jdo.option.DetachAllOnCommit">true</prop> 
        <prop key="javax.jdo.option.Multithreaded">true</prop> 
        <prop key="datanucleus.appengine.ignorableMetaDataBehavior">NONE</prop> 
       </props> 
      </property> 
     </bean> 
    </property> 
    <property name="allowCreate" value="false" /> 
</bean> 

<tx:annotation-driven transaction-manager="transactionManager" /> 

<bean id="transactionManager" class="org.springframework.orm.jdo.JdoTransactionManager"> 
    <property name="persistenceManagerFactory" ref="persistenceManagerFactoryProxy" /> 
</bean> 

अब जब मैं एक पेज डेटा संग्रहण तक पहुंचने में लोड:

यहाँ अपने आवेदन संदर्भ के हठ से संबंधित हिस्सा है। यह Google ऐप इंजन का उपयोग कर रहा है, इसलिए इसे ग्रहण (0 ग्रहण के लिए Google प्लगइन के साथ) में mvn gae:run के माध्यम से चलाएं, पहले mvn eclipse:eclipse के माध्यम से एक ग्रहण परियोजना बनाएं।

+0

प्रलेखन पढ़ना, मैंने निष्कर्ष निकाला है कि बीन "लेनदेन प्रबंधक" की संपत्ति "पर्सिस्टेंस मैनेजर फैक्ट्री" को प्रॉक्सी के बजाय बीन "लोकलपर्सिस्टेंस मैनेजर फैक्ट्रीबीन" का संदर्भ देना चाहिए। तो आपको अपने उदाहरण में अनाम होने के बजाय, उस बीन को एक आईडी देना होगा। – Luciano

उत्तर

3

मेरा सुझाव वसंत 3.1 दस्तावेज द्वारा सुझाए गए अनुसार TransactionAwarePersistenceManagerFactoryProxy या SpringPersistenceManagerProxyBean का उपयोग करना होगा। ऐसा लगता है कि यह JdoDaoSupport कक्षा को बदलने के लिए डिज़ाइन किया गया है।

जबकि आप अपना खुद का AbstractJdoDao रैपर बनाने के अपने प्रश्न में जो सुझाव दे रहे हैं, वह निश्चित रूप से बहिष्करण चेतावनी को खत्म कर देगा, मेरी एकमात्र चिंता यह है कि आप अनजाने में ऐसी स्थिति बना सकते हैं जो दूसरों के लिए बनाए रखना मुश्किल हो क्योंकि यह नहीं होगा उन्हें देखने के लिए क्या उपयोग किया जाता है।

दूसरी ओर, मैं बनाने कल्पना अपने स्वयं के आवरण एक बहुत तेजी से अपनी समस्या को हल करने के लिए तरीका है ...

आप ध्यान से के फायदे/नुकसान के साथ अपने स्वयं के आवरण का उपयोग कर के लाभ/नुकसान वजन चाहिए चीजें करने के वसंत 3.1 तरीके के साथ आगे बढ़ना। मेरे अनुभव में, शॉर्टकट लेना और कई बार भविष्य में आपको परेशान करने के लिए वापस आ सकता है।

+0

क्या 'सारजोडोडाओ' के बजाय 'PersistenceManagerFactory'' की तुलना में 'TransactionAwarePersistenceManagerFactoryProxy' का संदर्भ होना चाहिए? – hleinone

+0

हां, आप सही हैं। वे उदाहरण [स्प्रिंग 3.1 जेडीओ दस्तावेज] में उपयोग कर रहे हैं (http://static.springsource.org/spring/docs/3.1.0.RC1/spring-framework-reference/html/orm.html#orm-jdo -डाओस-सीधी) PersistenceManagerFactory को अपने दाओ क्लास में एक TransactionAwarePersistenceManagerFactoryProxy ऑब्जेक्ट का उपयोग करके इंजेक्शन दिखाएं। मुझे लगता है कि आप इसे एक अमूर्त वर्ग में इंजेक्ट कर सकते हैं और इससे वही प्राप्त कर सकते हैं; हालांकि, वे उदाहरणों में एक अमूर्त वर्ग का उपयोग नहीं कर रहे हैं। दस्तावेज़ों के मुताबिक, इस विधि का लाभ यह है कि आप किसी स्प्रिंग निर्भरताओं का उपयोग नहीं कर रहे हैं। – jmort253

+0

मैंने समस्या [गिटहब पर प्रोजेक्ट] में समस्या को अलग किया (https://github.com/hleinone/spring-gae-jdo)। अभी भी एक ही अपवाद के साथ खत्म हो रहा है। – hleinone

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