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
.
hleinone
source share