@事务性注释java.lang.IollegalArgumentException:事务必须正在运行



我在项目中使用JavaEE7和容器管理的事务。尽管我在方法上有@Transactional注释,但我得到了"Transaction must be running"异常。代码如下:

@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);
}

这段代码中缺少什么,交易没有开始?

问候,

胆汁

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有关更多信息,

最新更新