根据JTA标准,应该从事务方法抛出哪个异常?

时间:2018-05-25 09:50:56

标签: java exception rollback jta

让我们说我们开发了一些自定义JTA实现。

考虑以下方法:

@Transactional
public void foo() {
   em.save(...); // some interaction with EntityManager
   throw new IllegalStateException("Foo");
}

让我们说em.save(...)可以正常运行而不会抛出异常。所以我们总是以throw new IllegalStateException("Foo")结束。很明显,在这种情况下应该回滚交易。

问题是:在运行时,根据JTA标准,是否应该调用foo()方法抛出RollbackException或原始IllegalStateException

换句话说:

try {
   foo();
} catch (Exception e) {
   // What type of exception we should expect here?
}

我个人的观点是应该预期原始异常(在这种情况下为IllegalStateException("Foo"))。但是,我希望严格根据JTA文件或其他传统合同得到一些答案。

1 个答案:

答案 0 :(得分:1)

RollbackExceptionhttps://docs.oracle.com/javaee/7/api/javax/persistence/RollbackException.html)的文档提及:

  

当EntityTransaction.commit()失败时由持久性提供程序抛出。

在您的情况下,EntityTransaction.commit()永远不应该调用,因此不应抛出此异常。