【发布时间】:2016-01-15 08:39:45
【问题描述】:
我在grails 2.4.4 中的单个Service 上执行以下逻辑。
class SampleService {
void process(params1, params2) {
SampleDomain1 sd1 = new SampleDomain1()
sd1.setProperties(params1)
sd1.save()
SampleDomain2 sd2 = new SampleDomain2()
sd2.setProperties(params2)
sd2.save()
}
}
我的理解是Services 默认是事务性的。如果sd1.save() 成功但sd2.save() 不成功,它将回滚更改并抛出错误。而如果两者都成功,则两者都会在服务退出时提交。
如果我的理解是正确的,那么这两个应该都已经持久化到数据库中了。但是,问题是:它不会——除非您根据我使用同一组params1 和params2 的测试明确使用flush: true 参数。
sd1.save(flush: true)
SampleDomain2 sd2 = new SampleDomain2()
sd2.setProperties(params2)
sd2.save(flush: true)
}
顺便说一句,这是我真正要避免的(将其设置为@Transactional 有什么意义)。如果这是 Hibernate 4 / Grails 2.4 的问题,我需要做什么才能让我的服务在每次服务调用结束时再次提交?我需要配置 Grails 的任何全局配置吗?我真的需要在每项服务结束时自动刷新我的域类。
注意
我已经确认数据是正确的,包括调用.validate() 和其他检查器。成功执行.save(flush: true) 证明了这一点。我发现的问题是regarding to the update on Grails 2.4 在其FlushMode 上。现在,也许我真正需要的是一个全局设置来覆盖它。
【问题讨论】:
-
尝试将这个:
grails.gorm.failOnError=true添加到您的Config.groovy。这将告诉 Grails 在 GORM 持久性发生错误时全局抛出异常。 -
此外,刷新 Hibernate 会话(即使您的数据库与内存中的对象保持同步)与提交事务不同。因此,即使在刷新之后,事务的回滚也会恢复数据库更改。此外,我发现执行
assert domainObject.save()是一个很好的做法,以确保正确保存对象。
标签: grails grails grails-orm transactional