Transactions EJB3.1事务回滚不';行不通

Transactions EJB3.1事务回滚不';行不通,transactions,ejb-3.1,rollback,Transactions,Ejb 3.1,Rollback,我有以下情况: 我有一个无状态ejb,有两种方法a()和B()。方法B()对执行插入操作的方法A()执行n调用。 现在,如果A()抛出一个applicationException(我已经用@javax.ejb.applicationException(rollback=true))进行了注释),并且我在方法B()的catch块中捕获了该异常,那么这不会回滚我的事务e,因此执行插入: public void A()引发ApplicationException{ .....//some logic

我有以下情况:

我有一个无状态ejb,有两种方法
a()
B()
。方法
B()
对执行插入操作的方法
A()
执行n调用。 现在,如果A()抛出一个applicationException(我已经用
@javax.ejb.applicationException(rollback=true)
)进行了注释),并且我在方法B()的catch块中捕获了该异常,那么这不会回滚我的事务e,因此执行插入:

public void A()引发ApplicationException{

.....//some logic here

doInsert(); //entity layer method that perform the insert operation

throw new ApplicationException(); // this is only for test
public ApplicationException() {

   super();

}
}

这是方法B():

公共空间B(){

试一试{

   A(); //this method is called n time in a loop but it doesn't matter
}捕获(ApplicationException e){

e、 printStackTrace()

}

这是applicationException:

@javax.ejb.ApplicationException(rollback=true) 公共类ApplicationException扩展了异常{

.....//some logic here

doInsert(); //entity layer method that perform the insert operation

throw new ApplicationException(); // this is only for test
public ApplicationException() {

   super();

}
}

显然,如果在方法B()中删除catch块,则不会发生这种行为。 现在,我想知道是否有一种方法可以回滚我的事务,即使我在方法B()中捕获了异常。
谢谢!!!!

根据EJB3.1规范第14.2.1节:

检查为异常的应用程序异常可以定义为 通过将其列在 bean的businessinterface,无接口视图,主接口,组件 接口和web服务端点。一个应用程序异常 未经检查的异常由定义为应用程序异常 使用ApplicationException元数据注释对其进行注释,或 在部署描述符中用 应用程序异常元素


您的异常类扩展了exception,因此它是一个选中的异常,因此将忽略
@ApplicationException
注释。如果要在引发此异常时回滚该异常,应在(也可以在抛出异常之前执行,但从catch块执行可能更好,因为它强调“处理”异常)。或者,您可以将异常更改为扩展
RuntimeException
,但您可能不想这样做,这取决于您对未检查异常的感受。

要使代码正常工作,B()必须通过查找过程获取ejb的另一个实例,并在该实例上调用A()。这样,容器就有机会“参见”异常A()抛出。

是否有特定的原因让您只在抛出异常之前调用SetRollback,而不是在抛出异常之后调用catch子句?我所有的回滚都发生在catch子句中,所以我想知道我是否一直在做错事……任何一种方法都是可以的,所以我已经调整了答案。您的答案可能更干净,所以我决定他强调了这一点。