0

我对 JavaEE/JPA 还很陌生,我在我的项目中遇到了以下需求,我已经搜索了一段时间如何实现的需求,但到目前为止还没有成功,所以我希望你们中的任何人都可以指出我的错误,希望也能告诉我正确的解决方案是如何工作的,让我学习而不是仅仅复制一段工作代码。

问题:

在我的 Bean 中,我有一个调用 3 个不同 JPA 持久方法(1 个持久方法和 2 个合并方法)的方法,但我必须确保,如果这些持久方法中的一个或多个失败,我可以回滚整个事务,以避免进一步问题。

这是我的 bean 的外观:

@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(column is NOT NULL) 以确保会有异常,但由于某些未知原因(至少对我而言),没有抛出异常并且其他方法继续存在执行。如果我删除 UserTransaction 方法并删除@TransationManagement注释,则会引发异常,但我无法回滚整个方法。

你们中的任何人都可以告诉我我在这里做错了什么吗?

提前感谢所有帮助。

此致,

恩里科·贝加莫。

4

2 回答 2

0

@TransactionManagement不需要为此目的。

容器将在以下情况下回滚:

  • 系统异常
  • (未)用@ApplicationException 注释的检查异常

只要您的 EE 容器有能力,就会被抛出。因为例如 NullPointerException 是一个未经检查的异常非系统异常,所以这里通常不提供回滚。

于 2012-12-11T11:09:15.027 回答
0

既不需要使用UserTransaction, 也不需要@TransactionManagement注解,也不需要抛出任何异常。

您所描述的行为是默认的 JPA 行为。如果一个或多个操作在事务提交时失败,整个事务——即在数据库事务中执行的所有操作——将被回滚。回滚由 JPA 提供程序自动执行,因此您不必“手动”执行任何操作。

但是,您应该注意一件事 - 如果您在方法中管理 JPA 关系 - 即空引用等,您将需要恢复它们或在事务回滚时重新加载实体。

于 2012-12-11T11:40:26.043 回答