我是JavaEE / JPA的新手,我已经在我的项目中满足了以下需求,我已经搜索了一段时间如何实现,但到目前为止没有成功,所以我希望任何你可以指出我的错误并希望,也告诉我正确的解决方案是如何工作的,让我学习而不是仅仅复制一段工作代码。
问题:
在我的Bean中,我有一个方法调用3个不同的JPA持久化方法(1个持久化和2个合并),但我必须确保,如果这些持久化方法中的一个或多个失败,我可以回滚整个事务,避免进一步的问题。
这是我的豆子的样子:
@Stateless(mappedName = "FuncionarioBean")
@Remote(FuncionarioBeanRemote.class)
@TransactionManagement(TransactionManagementType.BEAN)//Was instructed to put this annotation, but I don't know the real impact of it in my application if it was set as a CONTAINER.
public class FuncionarioBean implements FuncionarioBeanRemote {
@PersistenceContext
private EntityManager em;
@Resource
private UserTransaction utx;
@Override
public void updateFuncionario(FuncionarioEntity funcionarioEditado) {
try{
utx.begin();
/* irrelevant code */
callJPAMergeMethod1();
/* irrelevant code */
callJPAMergeMethod2();
/* irrelevant code */
callJPACreateMethod1();
/* irrelevant code */
utx.commit();
} catch (Exception e) {
utx.rollback();
}
}
}
我将其中一个要更新/合并的元素设置为null(列为非NULL)以确保存在异常,但由于某些未知原因(至少对我来说),不会抛出任何异常,而另一个方法继续执行。如果我删除UserTransaction方法并删除@TransationManagement
注释,将抛出异常,但我无法回滚整个方法。
你们有谁能告诉我这里的错误吗?
提前感谢所有帮助。
最诚挚的问候,
Enrico Bergamo。
答案 0 :(得分:0)
@TransactionManagement
。
当a:
时,容器将回滚。 从例如NullPointerException是一个未经检查的异常非系统异常,这里通常不提供回滚。
答案 1 :(得分:0)
既不需要使用UserTransaction
,也不需要使用@TransactionManagement
注释,也不需要抛出任何异常。
您描述的行为是默认的JPA行为。如果一个或多个操作在事务提交时失败,则将回滚整个事务 - 即在数据库上的事务中执行的所有操作。回滚由JPA提供程序自动执行,因此您不必“手动”执行任何操作。
然而,您应该注意一件事 - 如果您正在管理方法中的JPA关系 - 即将引用等归零,则需要还原它们或在事务回滚时重新加载实体。