Конфигурирование JDO в Spring 3.1? - PullRequest
7 голосов
/ 13 января 2012

Раньше все мои DAO расширяли класс JdoDaoSupport, который теперь устарел весной 3.1 . Я создал свой собственный класс AbstractJdoDao, который охватывает PersistenceManagerFactory, и все DAO расширяются оттуда. Это то, что я должен делать?

Также в документации по JDO кажется, что прямое создание PersistenceManagerFactory не является параметром по умолчанию, но использование LocalPersistenceManagerFactoryBean, заключенное в TransactionAwarePersistenceManagerFactoryProxy. Как правильно создать экземпляры этих bean-компонентов и заставить их работать с аннотациями Spring * @Transactional.

Вот часть, связанная с постоянством контекста моего приложения:

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

Теперь, когда я загружаю страницу с доступом к хранилищу данных:

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

У меня есть мой пример проекта на GitHub . Он использует Google App Engine, поэтому либо запустите его через mvn gae:run в Eclipse (с плагином Google для Eclipse), сначала создав проект Eclipse через mvn eclipse:eclipse.

1 Ответ

3 голосов
/ 28 января 2012

Мое предложение будет использовать TransactionAwarePersistenceManagerFactoryProxy или SpringPersistenceManagerProxyBean, как предлагается в документации по Spring 3.1.Похоже, что это предназначено для замены класса JdoDaoSupport.

Хотя то, что вы предлагаете в своем вопросе о создании собственной оболочки AbstractJdoDao, конечно, устранит предупреждение об устаревании, моя единственная проблема в том, что вы можетенепреднамеренно создайте ситуацию, которую другим трудно поддерживать, поскольку это будет не то, что они привыкли видеть.

С другой стороны, я считаю, что создание собственной оболочки - очень быстрый способ решения вашей проблемы...

Вы должны тщательно взвесить преимущества / недостатки использования своей собственной обертки с преимуществами / недостатками продвижения вперед с помощью Spring 3.1.По моему опыту, использование ярлыков может и часто возвращаться, чтобы преследовать вас в будущем.

...