Jpa 来自EJB的事务控制

Jpa 来自EJB的事务控制,jpa,jakarta-ee,transactions,ejb,Jpa,Jakarta Ee,Transactions,Ejb,我对JavaEE/JPA相当陌生,我在我的项目中遇到了以下需求,这是我搜索了一段时间如何实现的需求,但到目前为止还没有成功,所以我希望你们中的任何人都能指出我的错误,并希望告诉我正确的解决方案是如何工作的,让我学习,而不是仅仅复制一段工作代码 问题: 在我的Bean中,我有一个方法调用3个不同的JPA持久化方法(1个persist和2个merge),但我必须确保,如果这些持久化方法中的一个或多个失败,我可以回滚整个事务,以避免进一步的问题 这就是我的豆子的外观: @Stateless(mappe

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

问题:

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

这就是我的豆子的外观:

@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不是null)以确保会有异常,但是由于一些未知的原因(至少对我来说),不会抛出异常,其他方法会继续执行。如果我删除UserTransaction方法并删除
@transactionmanagement
注释,将引发异常,但我无法回滚整个方法

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

提前谢谢你的帮助

致以最良好的祝愿


Enrico Bergamo.

@TransactionManagement
不需要用于此目的

当发生以下情况时,容器将回滚:

  • 系统异常
  • (未选中)用@ApplicationException注释的异常
如果EE容器能够,则抛出。
例如,由于NullPointerException是未检查的异常非系统异常,因此此处通常不提供回滚。

无需使用
UserTransaction
,也无需使用
@TransactionManagement
注释,也无需抛出任何异常

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

但是,有一件事您应该注意——如果您在方法中管理JPA关系——即,为引用设置null等等,您需要在事务回滚时还原它们或重新加载实体