作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建一个事务方法,该方法调用其他几个事务方法以保存一些相互依赖的数据库实体。如果任何调用失败,我希望事务完全回滚。然而,这不是观察到的行为。这是我的代码:
@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.REQUIRED
和 rollobackFor = Throwable.class
,但当事务在第二个 saveSubEntity< 处失败时
调用,第一个 subEntity
被提交。
最佳答案
也许问题是 Hibernate 无法为 save 方法打开事务。
假设如果 Hibernate 没有为 save 方法创建任何事务,则每个 saveSubEntity 调用将由于其 Propagation.REQUIRED 而处于不同的事务中。因此,每个 saveSubEntity 调用的更改都将提交到数据库。
要检查是否为 save 方法创建了交易,请帮我删除 saveSubEnitty 方法上的 Tranactional 注释。如果没有为 save 方法创建事务,您将看到错误。
关于java - 事务方法回滚内的 Hibernate 事务方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16487114/
我是一名优秀的程序员,十分优秀!