我们遇到了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是唯一实际适用于此上下文,但我们尝试其他只是为了安全起见。)
应用程序堆栈如下:
答案 0 :(得分:0)
为了将来的参考 - 似乎我们已经确定了问题 - 它是关于Spring AOP代理,它没有注意到本地方法调用。
如果将服务层performCheck()
移动到另一个spring bean,注入然后调用,则代理正确地生成一个新的事务上下文,并且该东西就像一个魅力。