Datanucleus:从@Transactional转移到非事务性

时间:2011-09-08 20:30:33

标签: spring jdo datanucleus transactional

我正在使用与Aspect-J编织的Datanucleus,JDO和Spring的声明性@Transactional管理。

但是当'普通'方法从@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不同的持久性管理器,这是原因吗? / p>

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

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

1 个答案:

答案 0 :(得分:1)

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

我已将(detachable="true")添加到我的@PersistenceCapable注释中,并设置了以下datanucleus选项:

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