Jakarta ee EJB事务需要新的

Jakarta ee EJB事务需要新的,jakarta-ee,transactions,ejb,ejb-3.0,Jakarta Ee,Transactions,Ejb,Ejb 3.0,我用REQUIRE_NEW注释了一个方法,我希望它能在一个新事务中执行。代码如下: public class EJBAImpl implements EJBA { @EJB private EJBB ejbb; public void someMethod(entity){ ejbb.create(entity); //doMoreStuff } } public class BaseEJB { public void

我用REQUIRE_NEW注释了一个方法,我希望它能在一个新事务中执行。代码如下:

public class EJBAImpl implements EJBA {
    @EJB
    private EJBB ejbb;

    public void someMethod(entity){
        ejbb.create(entity);
        //doMoreStuff
    }
}

public class BaseEJB {
    public void create(Entity entity) {
        //saveHere
    }
}

public class EJBBImpl extends BaseEJB implements EJBB {
    @Override
    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void create(Entity entity) {
        super.create(entity);
    }
}
然而,当我在create方法调用后的行中放置一个断点时(这里说的是domorseuff),我的实体并没有保存在数据库中。我错过了什么?我查过了,EJBB是一个代理

编辑:如果方法是继承的,那么它就不能工作。解决方案是更改EJBB中的方法,如下所示:

public class EJBBImpl extends BaseEJB implements EJBB {

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void anotherNameForCreate(Entity entity) {
        super.create(entity);
    }
}

有人知道当重写另一个类中的方法时它为什么不工作吗?

正如第13.3.7.1节中描述的ejb3.1规范一样,@TransactionAttribute具有特殊规则

如果bean类有超类,则应用以下附加规则

1) 在超类S上指定的事务属性应用于 由S定义的业务方法。如果是类级事务属性 未在S上指定,相当于 S上的TransactionAttribute(必需)

2) 可以在业务方法M上指定事务属性 由类S定义以重写方法M的事务属性 在类S上显式或隐式指定的值

3) 如果S类的方法M重写了由 S的超类M的事务属性由 适用于S类的上述规则


根据我的理解,你在第三点,因此,对于EJB容器,实际事务属性是AcRESRESION新的。

  • 容器必须使用新的事务上下文调用其事务属性设置为RequiresNew的企业Bean方法

  • 如果客户机在未与事务上下文关联的情况下调用企业Bean的方法,则容器会在将方法调用委托给企业Bean业务方法之前自动启动新事务。容器将自动登记业务方法访问的所有资源管理器和事务

  • 如果业务方法调用其他企业bean,则容器将通过调用传递事务上下文。当业务方法完成时,容器尝试提交事务。容器在将方法结果发送到客户端之前执行提交协议

  • 如果客户机使用事务上下文进行调用,则容器会在启动新事务和调用业务方法之前挂起事务上下文与当前线程的关联。在业务方法和新事务完成后,容器恢复暂停的事务关联

  • 解决方案


    只有在通过EJB引用从另一个bean调用方法时,才会创建新事务。在同一个bean中调用create不会产生新的事务。因此,您必须从另一个bean调用它。

    您可以将自身作为@EJB导入并调用self.method(),这将使它