委托服务方法的Spring + OpenJPA TransactionRequiredException

问题描述

| 我们在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,然后注入并调用它,代理将正确生成新的事务上下文,并且该事物的工作原理就像一个魅力。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...