Datanucleus: переход от @Transactional к нетранзакционному - PullRequest
2 голосов
/ 09 сентября 2011

Я использую Datanucleus, JDO и декларативное @Transactional управление Spring, сплетенное с 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
  • AМетод @Transactional вызывает нормальный метод
  • Обычный метод вызывает нормальный метод

Если я вызываю dao.refresh(l), я получаю: "Объект с идентификатором" "управляется другимДиспетчер объектов », так что, может быть, Spring работает над диспетчером сохраняемости, отличным от DAO, это причина?

Вот моя весенняя конфигурация (это может быть уместно):

<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 Ответ

1 голос
/ 10 сентября 2011

Оказалось, что для этого мои объекты должны быть отсоединяемыми.

Iv'e добавил (detachable="true") к моим @PersistenceCapable аннотациям и установил следующие параметры ядра данных:

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