私は@Transactional
Aspect-J を織り込んだ Datanucleus、JDO、および Spring の宣言型管理を使用しています。
しかし、「通常の」メソッドがメソッドから永続オブジェクトを取得する@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 とは別の永続マネージャーで動作している可能性がありますが、これが原因ですか?
これが私の春の構成です(関連する可能性があります):
<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>