【问题标题】:Transactional Control from an EJB来自 EJB 的事务控制
【发布时间】:2012-12-11 10:47:31
【问题描述】:

我对 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(列不为空)以确保会有异常,但由于某些未知原因(至少对我而言),没有抛出异常,而另一个方法不断被执行。如果我删除 UserTransaction 方法并删除 @TransationManagement 注释,则会抛出异常,但我无法回滚整个方法。

谁能告诉我我在这里做错了什么?

提前感谢所有帮助。

最好的问候,

恩里科·贝加莫。

【问题讨论】:

    标签: jpa jakarta-ee transactions ejb


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      @TransactionManagement 不需要用于此目的。

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-12
        • 1970-01-01
        相关资源
        最近更新 更多