Я использую 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>