【问题标题】:Datanucleus: moving from @Transactional to non-transactionalDatanucleus:从@Transactional 迁移到非事务性
【发布时间】:2011-11-13 07:45:23
【问题描述】:

我正在使用 Datanucleus、JDO 和 Spring 的声明式 @Transactional 管理与 Aspect-J 交织在一起。

但是当“正常”方法从@Transactional 方法获取持久对象时,对象的状态将变为瞬态(持久性管理器似乎已被删除)并且对象不再持久。

例子:

public class Example {

    public void test() throws Exception {
       Login l = getLogin();                          
       JDOHelper.getObjectState(l);              // transient instead of persistent
       l.getSomeOtherPersistentObj().doStuff();  // NullpointerException :(
    }

    @Transactional
    private Login getLogin() {
        // do transactional stuff here
        // ..
        return dao.find(Login.class, 1);
    }
}

为什么会这样?如何在不需要交易的地方添加@Transactional 来解决它?以下确实(显然)有效,因此这表明可以建立事务连接和非事务连接:

  • @Transactional 方法调用@Transactional 方法
  • @Transactional 方法调用普通方法
  • 普通方法调用普通方法

如果我调用dao.refresh(l),我会得到:'ID 为“”的对象由不同的对象管理器管理',所以也许 Spring 正在使用与 DAO 不同的持久性管理器,这是原因吗?

这是我的 spring 配置(可能是相关的):

<bean id="pmf" class="org.datanucleus.api.jdo.JDOPersistenceManagerFactory" destroy-method="close">
  <property name="connectionDriverName" value="com.mysql.jdbc.Driver"/>
  ...
  <constructor-arg>
    <map>
      <entry key="datanucleus.autoCreateSchema" value="true" />
    </map>
  </constructor-arg>
</bean>
<bean id="myPmfProxy" class="org.springframework.orm.jdo.TransactionAwarePersistenceManagerFactoryProxy">
  <property name="targetPersistenceManagerFactory" ref="pmf" />
</bean>
<bean id="transactionManager" class="org.springframework.orm.jdo.JdoTransactionManager">
  <property name="persistenceManagerFactory" ref="myPmfProxy" /> 
</bean>
<bean id="JDODao" class="sw.JDODao">
  <property name="persistenceManagerFactory" ref="myPmfProxy" /> 
</bean>

【问题讨论】:

    标签: spring jdo datanucleus transactional


    【解决方案1】:

    事实证明,我的对象需要可拆卸才能做到这一点。

    我已将(detachable="true") 添加到我的@PersistenceCapable 注释并设置以下数据核选项:

    <entry key="datanucleus.DetachAllOnCommit" value="true" />
    <entry key="datanucleus.detachedState" value="all" />
    

    【讨论】:

    • 或使用 OpenPersistenceManagerInView(或任何 Spring 调用它)在整个 test() 方法中保持 PM 打开。
    猜你喜欢
    • 2019-07-19
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多