事务方法回滚中的Hibernate事务方法调用

时间:2013-05-10 16:46:42

标签: java spring hibernate annotations transactional

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

@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.REQUIREDrollobackFor = Throwable.class,但当第二次saveSubEntity来电时交易失败时,第一个subEntity会被提交。

2 个答案:

答案 0 :(得分:0)

问题可能是Hibernate无法为保存方法打开一个事务。

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

要检查是否为保存方法创建了交易,您是否可以帮我删除 saveSubEnitty 方法上的 Tranactional 注释。如果没有为保存方法创建任何事务,您将看到错误。

答案 1 :(得分:0)

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