让我们说我们开发了一些自定义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文件或其他传统合同得到一些答案。
答案 0 :(得分:1)
RollbackException
(https://docs.oracle.com/javaee/7/api/javax/persistence/RollbackException.html)的文档提及:
当EntityTransaction.commit()失败时由持久性提供程序抛出。
在您的情况下,EntityTransaction.commit()
永远不应该调用,因此不应抛出此异常。