Grails,在引发异常后保存域类

时间:2018-09-18 23:49:32

标签: grails gorm

使用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)

2 个答案:

答案 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)方法。