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