Jakarta ee Java EE WildFly 8.2事务必需异常

Jakarta ee Java EE WildFly 8.2事务必需异常,jakarta-ee,transactions,ejb,wildfly,Jakarta Ee,Transactions,Ejb,Wildfly,我的应用程序部署在WildFly 8.2上 我正在处理一批 会话EJB中的方法A需要新的注释 在它里面,我调用另一个方法,方法B,在同一个EJB上,另一个需要新注释 此方法B引发运行时异常。方法A捕获它并继续 但处理JPA更新的下一行给出了事务所需的异常 基本上,我不知道为什么带有所需新注释的方法B会影响方法A 它是JPA Dao丢失事务的实体管理器 如何使方法B独立运行,并在其中发生异常时仅回滚方法B。您可以使用会话上下文通过EJB容器调用方法B,以便事务注释生效 您的EJB应该如下所示: @

我的应用程序部署在WildFly 8.2上

我正在处理一批

会话EJB中的方法A需要新的注释

在它里面,我调用另一个方法,方法B,在同一个EJB上,另一个需要新注释

此方法B引发运行时异常。方法A捕获它并继续

但处理JPA更新的下一行给出了事务所需的异常

基本上,我不知道为什么带有所需新注释的方法B会影响方法A

它是JPA Dao丢失事务的实体管理器


如何使方法B独立运行,并在其中发生异常时仅回滚方法B。

您可以使用会话上下文通过EJB容器调用方法B,以便事务注释生效

您的EJB应该如下所示:

@Resource
SessionContext sessionCtx;
.
.
.
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void methodA() {
    <Your-EJB-Interface> ejbObject = sessionCtx.getBusinessObject(<Your-EJB-Interface>.class);
     ejbObject.methodB();
}

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void methodB....
@Resource
SessionContext sessiontx;
.
.
.
@TransactionAttribute(TransactionAttributeType.REQUIRES\u NEW)
公开无效方法a(){
ejbObject=sessiontx.getBusinessObject(.class);
ejbObject.methodB();
}
@TransactionAttribute(TransactionAttributeType.REQUIRES\u NEW)
公共无效方法B。。。。

您可以使用会话上下文通过EJB容器调用methodB,因此事务注释可以生效

您的EJB应该如下所示:

@Resource
SessionContext sessionCtx;
.
.
.
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void methodA() {
    <Your-EJB-Interface> ejbObject = sessionCtx.getBusinessObject(<Your-EJB-Interface>.class);
     ejbObject.methodB();
}

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void methodB....
@Resource
SessionContext sessiontx;
.
.
.
@TransactionAttribute(TransactionAttributeType.REQUIRES\u NEW)
公开无效方法a(){
ejbObject=sessiontx.getBusinessObject(.class);
ejbObject.methodB();
}
@TransactionAttribute(TransactionAttributeType.REQUIRES\u NEW)
公共无效方法B。。。。

如果从同一EJB调用另一个方法,则不考虑事务属性。如果您想要方法B中的新事务,请将其移动到新的EJB中。现在方法A和方法B共享同一个事务。谢谢,我现在意识到了这一点,正如S.Stavreva所建议的,我将使用sessionContext.getBusinessObject(Object.class)。如果从同一EJB调用另一个方法,则不考虑事务属性。如果您想要方法B中的新事务,请将其移动到新的EJB中。现在,方法A和方法B共享同一个事务。谢谢,我现在意识到了这一点,正如S.Stavreva建议的那样,我将使用sessionContext.getBusinessObject(Object.class)。是的,它是这样工作的,现在有意义了,应该通过代理调用方法来创建新事务。谢谢。是的,它是这样工作的,现在有了意义,应该通过代理调用方法来创建新的事务。非常感谢。