使用grails 3.3.8
如果在发布保存的服务方法中引发了捕获的异常,则任何domainclass.save(flush:true,failOnError:true)都不会保存。即
try {
//some code that throws exception
} catch (Exception exception) {
print 'some message'
}
domainclass.save(flush:true,failOnError:true)
答案 0 :(得分:2)
我找到了解决上述问题的方法。如果您将try catch块提取出来,然后将其放入其他方法中,则域类保存确实会持久化。
即
callMethodThatContainsTryCatch()
domainClass.save()
代替
try {
} catch (Exception exception) {
println "some exception"
}
domainClass.save()
然后,您的方法中的任何异常都将回退该方法中的所有gorm事务。
答案 1 :(得分:-1)
好吧,在Grails 3.1之前的服务默认情况下是事务性的,从Grails 3.1开始,只有在应用@Transactional
批注的情况下,它们才是事务性的。
如果在触发异常时您正在使用事务服务,则该事务将被标记为进行回滚。同时回滚事务时,将清除GORM使用的Hibernate会话。
我假设您的服务被标记为@Transactional
。这就是为什么您的域没有被保存的原因。要解决上述行为,您可以将服务标记为@NotTransactional
。这将为您提供对服务方法的更多控制,只是要注意它不再是事务性的。引发异常后,GORM会话将不会被清除。
编辑:
由于您正在呼叫.save()
,因此强烈建议您在事务内进行操作。然后,您可以使用withTransaction(Closure)
方法。