Datanucleus:从@Transactional 迁移到非事务性
Posted
技术标签:
【中文标题】Datanucleus:从@Transactional 迁移到非事务性【英文标题】:Datanucleus: moving from @Transactional to non-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
来解决它?以下确实(显然)有效,因此这表明可以建立事务连接和非事务连接:
如果我调用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>
【问题讨论】:
【参考方案1】:事实证明,我的对象需要可拆卸才能做到这一点。
我已将(detachable="true")
添加到我的@PersistenceCapable
注释并设置以下数据核选项:
<entry key="datanucleus.DetachAllOnCommit" value="true" />
<entry key="datanucleus.detachedState" value="all" />
【讨论】:
或使用 OpenPersistenceManagerInView(或任何 Spring 调用它)在整个 test() 方法中保持 PM 打开。以上是关于Datanucleus:从@Transactional 迁移到非事务性的主要内容,如果未能解决你的问题,请参考以下文章
Datanucleus、JDO 和可执行 jar - 怎么做?
Class org.datanucleus.api.jdo.JDOPersistenceManagerFactory was not found
Class org.datanucleus.api.jdo.JDOPersistenceManagerFactory was not found