@Transactional annotation java.lang.IllegalArgumentException:必须运行Transaction

时间:2013-11-25 10:07:55

标签: jta transactional java-ee-7

我在项目中使用JavaEE7和容器管理的事务。虽然我在方法上有@Transactional注释,但我得到“事务必须运行”异常。 代码如下:

@Transactional(Transactional.TxType.MANDATORY)
public void myMethod(Project project) {

    final ObjectIdentity objectId = new ObjectIdentityImpl(project);
    final Sid sid = new PrincipalSid(SecurityContextHolder.getContext().getAuthentication());
    final Permission p = BasePermission.ADMINISTRATION;
    MutableAcl acl = null;
    try {
        List<Sid> sids = new ArrayList<>();
        sids.add(sid);
        acl = (MutableAcl) aclService.readAclById(objectId, sids);

    } catch (Exception ex) {
        acl = ((MutableAclService) aclService).createAcl(objectId); // This line causes exception
    }

    acl.insertAce(acl.getEntries().size(), p, sid, true);
    aclService.updateAcl(acl);
}

此代码中缺少什么,该事务未开始?

亲切的问候,

比拉尔

1 个答案:

答案 0 :(得分:4)

使用Transactional.TxType.MANDATORY注释的方法需要已经运行的事务。这意味着当方法调用开始时,事务必须已经开始。您可以通过在调用使用Transactional.TxType.MANDATORY注释的方法的另一个方法中启动事务来实现此目的。

如果您想在当前没有正在运行的事务时启动新事务,则必须将事务类型设置为Transactional.TxType.REQUIRED(如果没有事务已经运行,则将启动新事务)或Transactional.TxType.REQUIRES_NEW(无论如何都会启动新交易 - 这取决于您的需求。 Transactional.TxType.REQUIRED类型是CDI中的默认事务类型,因此实际上您可以只使用@Transactional而不指定任何类型。

有关详细信息,请参阅http://docs.oracle.com/javaee/7/api/javax/transaction/Transactional.TxType.html