Configuring JDO in Spring 3.1?

I used all my DAOs to extend the JdoDaoSupport class, which is now deprecated in Spring 3.1 . I created my own AbstractJdoDao class, which wraps a PersistenceManagerFactory , and all DAOs expand from there. Is that what I have to do?

Also in the JDO documentation, it seems that directly creating a PersistenceManagerFactory not the default option, but to use LocalPersistenceManagerFactoryBean wrapped in TransactionAwarePersistenceManagerFactoryProxy . How to properly create these beans and make them work with Spring @Transactional annotations.

Here is the part related to saving my application context:

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

Now, when I load the page, access to the data store:

 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 

I have my sample project on GitHub . It uses the Google App Engine, so either run it through mvn gae:run in Eclipse (with the Google plugin for Eclipse) by first creating an Eclipse project through mvn eclipse:eclipse .

+7
source share
1 answer

My suggestion was to use TransactionAwarePersistenceManagerFactoryProxy or SpringPersistenceManagerProxyBean , as suggested in the Spring 3.1 documentation. It looks like this is intended to replace the JdoDaoSupport class.

While what you suggest in your question about creating your own AbstractJdoDao shell will surely eliminate the obsolescence warning, my only problem is that you can inadvertently create a situation that is difficult for others to maintain because it does not will be what they used to see.

On the other hand, I assume that creating your own shell is a very quick way to solve your problem ...

You must carefully weigh the advantages / disadvantages of using your own wrapper with the advantages / disadvantages of moving forward using the Spring 3.1 method. In my experience, shortcuts can and often come back to haunt you in the future.

+3
source

All Articles