我们遇到了Spring 3.0.5事务管理和OpenJPA 2.0.1的问题,并且我们似乎无法查明问题,因此无法获得任何帮助。来自代理服务方法的Spring + OpenJPA TransactionRequiredException
该架构可以被分解如下:
服务层
@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是用作测试框架