1

我正在尝试创建一个事务方法,它调用其他几个事务方法以保存一些相互依赖的数据库实体。如果任何调用失败,我希望事务完全回滚。然而,这不是观察到的行为。这是我的代码:

@Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Throwable.class)
public void save(EntityToBeSaved entity) {
    try{
            for(SubEntity sub: entity.getSubEntities()) //specifics omitted
                  saveSubEntity(sub); //this is transactional
    }
    catch (DataIntegrityViolationException e){
        throw new BusinessException("Duplicate Name");
    }
}

saveSubEntity也有Propagation.REQUIREDand rollobackFor = Throwable.class,但是当事务在第二次saveSubEntity调用失败时,第一次subEntity被提交。

4

2 回答 2

0

也许问题是 Hibernate 无法为save方法打开事务。

假设如果 Hibernate 没有为save方法创建任何事务,那么每个saveSubEntity调用将由于其 Propagation.REQUIRED 而位于不同的事务中。因此,每个saveSubEntity调用的更改都将提交到数据库。

要检查是否为save方法创建了事务,您能否帮我删除saveSubEnitty方法上的Tranactional注释。如果没有为保存方法创建事务,您将看到将发生错误。

于 2013-05-11T04:26:44.983 回答
0

显然,这个问题是由于 Spring 注入错误而产生的,因为服务在启动时没有实例化,导致注释无法正常工作。感谢您的帮助。

于 2013-05-13T09:32:48.343 回答