gpt4 book ai didi

java - 在 Spring 3.1 中配置 JDO?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:33:02 24 4
gpt4 key购买 nike

我曾经让我所有的 DAO 扩展 JdoDaoSupport 类,现在是 deprecated in Spring 3.1 .我创建了自己的 AbstractJdoDao 类,它包装了 PersistenceManagerFactory 并且所有 DAO 都从那里扩展。这是我应该做的吗?

也在documentation on 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

我有 my example project on GitHub .它使用 Google App Engine,所以要么通过 Eclipse 中的 mvn gae:run 运行它(使用 Eclipse 的 Google 插件),首先通过 mvn eclipse:eclipse 创建一个 Eclipse 项目.

最佳答案

我的建议是按照 Spring 3.1 文档的建议使用 TransactionAwarePersistenceManagerFactoryProxySpringPersistenceManagerProxyBean。看起来这是为了替换 JdoDaoSupport 类。

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

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

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

关于java - 在 Spring 3.1 中配置 JDO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8853133/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com