来自EJB的事务控制

时间:2012-12-11 10:47:32

标签: jpa java-ee transactions ejb

我是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。

2 个答案:

答案 0 :(得分:0)

为此目的不需要

@TransactionManagement

当a:

时,容器将回滚
  • 系统例外
  • (un)检查使用@ApplicationException
  • 注释的异常
如果您的EE容器有能力,则抛出

。 从例如NullPointerException是一个未经检查的异常非系统异常,这里通常不提供回滚。

答案 1 :(得分:0)

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

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

然而,您应该注意一件事 - 如果您正在管理方法中的JPA关系 - 即将引用等归零,则需要还原它们或在事务回滚时重新加载实体。