问题描述
|
我们在Spring 3.0.5事务管理和OpenJPA 2.0.1中遇到了问题,我们似乎无法查明问题所在,因此可以提供任何帮助。
该体系结构可以细分如下:
服务层
@Autowired
private DAOInterface daoReference;
....
public void doStuff() {
boolean test = performCheck();
}
....
private boolean performCheck() {
return daoReference._performDAOCheck();
}
DAO层
@PersistenceContext
private EntityManager entityManager;
.....
@Transactional
public boolean _performDAOCheck() {
boolean result = true;
// fetch entity manager,perform something and return boolean value
return result;
}
这段代码可以执行,但是我们真的不喜欢DAO层上事务划分的存在,而是希望将其转移到上面的服务层。
但是,如果我们将@Transactional
注释移到服务层委托方法并将其从DAO层中删除,则会得到javax.persistence.TransactionrequiredException
,它指示需要进行交易但未激活交易。
问题是-为什么以及如何通过委托方法“激活”交易?请注意,我们已经尝试了各种事务传播修饰符,但似乎没有做任何有用的操作(REQUIRES_NEW是在这种情况下唯一实际适用的方法,但是我们只是为了安全起见尝试了其他方法)。
应用程序堆栈如下:
春季3.0.5
Bitronix 2.1.1
OpenJPA 2.0.1
Tomcat 6.0.32
JUnit 4.8.2用作测试框架
解决方法
供以后参考-看来我们已经解决了这个问题-关于Spring AOP代理,它不会注意到本地方法调用。
如果将服务层
performCheck()
移至另一个spring bean,然后注入并调用它,代理将正确生成新的事务上下文,并且该事物的工作原理就像一个魅力。