当前位置: 首页 > 面试题库 >

在Spring 3.1中配置JDO?

家浩瀚
2023-03-14
问题内容

我曾经让我的所有DAO扩展了JdoDaoSupport该类,而该类现在在Spring
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中运行(使用Eclipse的Google插件),首先通过来创建Eclipse项目mvn eclipse:eclipse


问题答案:

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

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

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

您应该仔细权衡使用自己的包装器的优点/缺点与Spring 3.1处事方式的优点/缺点。以我的经验,捷径可以而且经常在将来再次困扰您。



 类似资料:
  • 我一直在尝试使用Spring3.1的bean定义概要文件和嵌套bean。我希望可以根据活动配置文件定义不同的bean。请考虑以下非常简化的示例,使我的Spring上下文包含如下内容 我得到以下错误: 线程“main”org.springframework.beans.factory.BeanCreationException中出现异常:创建类路径资源[applicationcontext.xml]

  • 我在Spring3.1中使用@Cacheable。我对Cacheable中的值和键映射参数有点混淆。以下是我正在做的: 这里发生的情况是,第二个方法依赖于第一个方法的选定值,但问题是假设当我传递zoneMastNo=1和areaMastNo=1时,第二个方法返回第一个方法结果。事实上,我有很多服务,因此,我希望使用公共值来缓存特定的用例。现在我的问题是: 我如何解决这个问题 对每个服务都使用cac

  • 我正在尝试实现Spring3.1缓存,正如这里和这里所解释的,但它似乎不起作用:我的方法每次都会运行,即使它被标记为@cacheable。我做错了什么? 我已经将它移动到一个带有自己配置文件的junit测试用例中,以将它与应用程序的其余部分隔离开来,但问题仍然存在。以下是相关文件: Spring-test-servlet.xml ehcache.xml 我的测试。JAVA 相关Pom条目:(spr

  • 我的web应用程序使用的是Spring3.1和hibernate4。在这里,我试图为eh缓存,但得到一些错误,这是我的配置,我已经使用:- dispatcher-servlet.xml ehcache.xml 这是依赖性:— 我得到以下错误:-- 严重:在org.springframework.beans.factory中上下文初始化失败。BeanCreationException:创建名为“or

  • 问题内容: 我的目标是配置,使其仅序列化带有注释的元素。 为了做到这一点,我按照下面的说明进行了说明,该说明说明了如何配置对象映射器。 我包括自定义描述objectmapper 这里。 但是,当类被序列化时,它仍包含json中的所有属性。 有人暗示吗?提前致谢 Jackson 1.8.0 spring 3.0.5 CustomObjectMapper servlet.xml NumbersOfNe

  • 我想在发布者的AEM 6中实现CA siteminder。它的工作方式是应用程序的最终用户将使用登录表单并进入应用程序。成功申请后,用户将登陆主页,在那里她将能够看到她的个人信息,如姓名、出生日期、病史和所有类型的数据。在提供错误的密码时,用户将收到错误消息。这就像任何正常的Web应用程序一样。这里的问题是所有用户信息都将来自后端,即Web服务。CRX中不会保存任何用户或最少的信息。我在sitem