来自委托服务方法的Spring + OpenJPA TransactionRequiredException

时间:2011-05-25 15:00:22

标签: spring transactions tomcat6 junit4 openjpa

我们遇到了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是唯一实际适用于此上下文,但我们尝试其他只是为了安全起见。)

应用程序堆栈如下:

  1. Spring 3.0.5
  2. Bitronix 2.1.1
  3. OpenJPA 2.0.1
  4. Tomcat 6.0.32
  5. JUnit 4.8.2用作测试框架

1 个答案:

答案 0 :(得分:0)

为了将来的参考 - 似乎我们已经确定了问题 - 它是关于Spring AOP代理,它没有注意到本地方法调用。

如果将服务层performCheck()移动到另一个spring bean,注入然后调用,则代理正确地生成一个新的事务上下文,并且该东西就像一个魅力。