首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Spring 3.1中配置JDO?

在Spring 3.1中配置JDO?
EN

Stack Overflow用户
提问于 2012-01-13 23:42:41
回答 1查看 3.9K关注 0票数 7

我过去常常让我所有的DAO都扩展JdoDaoSupport类,现在这个类就是deprecated in Spring 3.1。我已经创建了自己的AbstractJdoDao类,它包装了PersistenceManagerFactory和所有DAO。这是我应该做的吗?

同样在documentation on JDO中,PersistenceManagerFactory的直接实例化似乎不是默认选项,而是使用包装在TransactionAwarePersistenceManagerFactoryProxy中的LocalPersistenceManagerFactoryBean。如何正确地实例化这些beans并使它们与Spring的@Transactional注解一起工作。

下面是我的应用程序上下文中与持久性相关的部分:

代码语言:javascript
复制
<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>

现在,当我加载一个访问数据存储的页面时:

代码语言:javascript
复制
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了。它使用的是Google App Engine,所以要么在Eclipse中通过mvn gae:run运行它(使用Eclipse的Google Plugin ),首先通过mvn eclipse:eclipse创建一个Eclipse项目。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-28 07:45:14

我的建议是按照Spring3.1文档的建议使用TransactionAwarePersistenceManagerFactoryProxySpringPersistenceManagerProxyBean。这似乎是为了替换JdoDaoSupport类而设计的。

虽然您在创建自己的AbstractJdoDao包装器的问题中提出的建议当然会消除弃用警告,但我唯一担心的是,您可能无意中造成了其他人很难维护的情况,因为它不是他们所习惯看到的。

另一方面,我认为创建自己的包装器是解决问题的一种非常快速的方法……

您应该仔细权衡使用自己的包装器的优缺点和继续使用Spring3.1的方式的优缺点。根据我的经验,走捷径可能而且经常会在未来再次困扰你。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8853133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档