Java 在事务方法回滚中休眠事务方法调用
我试图创建一个事务性方法,它调用其他几个事务性方法来保存一些相互依赖的db实体。如果任何调用失败,我希望事务完全回滚。然而,这不是观察到的行为。这是我的密码: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
@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方法。您是通过新操作还是依赖项注入技术创建服务实例的?