Java 在事务方法回滚中休眠事务方法调用

Java 在事务方法回滚中休眠事务方法调用,java,spring,hibernate,annotations,transactional,Java,Spring,Hibernate,Annotations,Transactional,我试图创建一个事务性方法,它调用其他几个事务性方法来保存一些相互依赖的db实体。如果任何调用失败,我希望事务完全回滚。然而,这不是观察到的行为。这是我的密码: @Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Throwable.class) public void save(EntityToBeSaved entity) { try{ for(Su

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

@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
也具有
传播。必需的
rollobackFor=Throwable.class
,但是当事务在第二次
saveSubEntity
调用失败时,会提交第一个
子实体

问题可能是Hibernate无法为save方法打开事务

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


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

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

非常令人惊讶。能否显示
saveSubEntity()
的代码?另外,readOnly=false和propagation=REQUIRED是默认值。您可以删除这些属性。您好,谢谢您的帮助。实际上,我放置了一个断点,并计算了TransactionSpectSupport.currentTransactionStatus(),它抛出了一个NotTransactionException,因此显然父级不会打开事务,即使它具有Propagation.REQUIRED。知道为什么会出现这种情况吗?因为您使用的是基于注释的Spring事务,我猜您在应用程序上下文的Spring配置文件中声明了标记
。最后,您应该检查标记
,并确保具有save方法的bean必须在base-package中。是的,所有这些参数都是正确的,问题在于显式构造函数调用。@Manos M:Hm,奇怪的是,当服务bean没有被DI容器实例化时,您可以调用save方法。您是通过新操作还是依赖项注入技术创建服务实例的?