Java 如何在EJB3.0中管理事务

Java 如何在EJB3.0中管理事务,java,ejb-3.0,Java,Ejb 3.0,我在weblogic服务器上使用EJB3.0。下面是我的EJB类。 在这个类中,我希望在方法级别维护事务。 所以我用TransactionAttribute标记了这个方法。但是当这个 方法,然后它会给出下面附加的错误。 注意@TransactionManagement已被注释 @Stateless(name = "TestSystem", mappedName = "TestSystemBean") @Remote(value = Test.class) //@TransactionManag

我在weblogic服务器上使用EJB3.0。下面是我的EJB类。 在这个类中,我希望在方法级别维护事务。 所以我用TransactionAttribute标记了这个方法。但是当这个 方法,然后它会给出下面附加的错误。 注意@TransactionManagement已被注释

@Stateless(name = "TestSystem", mappedName = "TestSystemBean")
 @Remote(value = Test.class)
//@TransactionManagement(value=TransactionManagementType.BEAN)
public class AssignmentSystemBean 
{

    @Resource
    protected SessionContext sessctx = null;

    public void setSessionContext(SessionContext ctx) {
        sessctx = ctx;
    }

  @TransactionAttribute(value=TransactionAttributeType.REQUIRED)
  public int saveAssignAddress(String username, String password, Address d, int id, String s) throws SQLException,Exception {
    sessctx.getUserTransaction ().begin ();
    return 0;
  }

}
所以我的问题是,有没有其他方法不将bean事务类型设置为bean, 我们可以使用@TransactionAttribute(value=TransactionAttributeType.REQUIRED)。
在注释掉
@TransactionManagement(value=TransactionManagementType.Bean)
之后,我不能将Bean标记为TransactionManagementType.Bean,这意味着您使用容器管理事务(CMT)。但是,在方法
saveAssignAddress()
中,您尝试调用
getUserTransaction()
,这在使用CMT的bean中是不允许的。正如规范所说:

getUserTransaction方法返回javax.transaction.UserTransaction接口。实例可以使用此接口来划分事务并获取事务状态。只有具有bean管理的事务划分的会话bean的实例才能使用此方法


你解决了两个问题。删除sessctx.getUserTransaction().begin()因为这样的构造应该只用于bean管理的事务(BMT)。

为什么要自己管理事务?使用
TransactionAttributeType.REQUIRES\u NEW
怎么样?您提到的附加错误在哪里?我可以假设该错误与调用UserTransaction.begin()有关,因为容器管理的事务已在进行中。我添加了错误图像。@Thomas,REQUIRES_NEW也出现了相同的异常。@Gimby,出现此异常是因为EJB未标记为“value=TransactionManagementType.BEAN”。因此,在没有将其标记为BEAN类型的情况下,我们还可以使用TransactionAttribute作为REQUIRED或REQUIRED\u NEWRight。要么使用CMT(x)要么使用BMT。@Naveen混合模式无论如何都不明智。问题是:您为什么要这样做?@Thomas,还有一件事,当我将这个ejbbean标记为Bean类型时,然后服务器开始维护与DB的永久连接,一段时间后开始给出另一个异常ResourcePoolException’。我真的不知道连接在哪里打开以及如何跟踪它。您能给我一些指导来调试它,这样我就可以使用BEAN类型了吗mode@Naveen我怀疑你没有完成所有的交易。此外,我不能建议任何位置开始调试。我可能会从异常的stacktrace中的某个地方开始,查找连接的打开和关闭位置。最后但并非最不重要的一点是,我建议不要使用bean管理的事务,因为它们更有可能出错。所以我重复我的问题:为什么你想自己管理事务?@Thomas,我在做一个非常老的项目,所有的东西都已经存在,而不是我在做迁移活动,我被卡住了。