Grails,抛出异常后保存域 class
Grails, save domain class after exception has been thrown
使用 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)
我找到了解决上述问题的方法。如果您提取您的 try catch 块并将其放入不同的方法中,域 class 保存确实会保留。
即
callMethodThatContainsTryCatch()
domainClass.save()
而不是
try {
} catch (Exception exception) {
println "some exception"
}
domainClass.save()
然后您的方法中的任何异常都会回滚该方法中的所有 gorm 事务。
好吧,在 Grails 3.1 之前,服务默认是事务性的,从 Grails 3.1 开始,它们只有在应用 @Transactional
注释时才具有事务性。
如果您在触发异常时使用事务服务,事务将被标记为执行回滚。同时,当事务回滚时,GORM 使用的 Hibernate 会话被清除。
我假设您的服务被标记为 @Transactional
。这就是您的域未被保存的原因。要避免上述行为,您可以将您的服务标记为 @NotTransactional
。这将为您提供对服务方法的更多控制,请注意它不再是事务性的。并且抛出异常后不会清除 GORM 会话。
编辑:
因为您正在调用 .save()
,所以强烈建议在事务内进行。然后您可以使用 withTransaction(Closure)
方法。
使用 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)
我找到了解决上述问题的方法。如果您提取您的 try catch 块并将其放入不同的方法中,域 class 保存确实会保留。
即
callMethodThatContainsTryCatch()
domainClass.save()
而不是
try {
} catch (Exception exception) {
println "some exception"
}
domainClass.save()
然后您的方法中的任何异常都会回滚该方法中的所有 gorm 事务。
好吧,在 Grails 3.1 之前,服务默认是事务性的,从 Grails 3.1 开始,它们只有在应用 @Transactional
注释时才具有事务性。
如果您在触发异常时使用事务服务,事务将被标记为执行回滚。同时,当事务回滚时,GORM 使用的 Hibernate 会话被清除。
我假设您的服务被标记为 @Transactional
。这就是您的域未被保存的原因。要避免上述行为,您可以将您的服务标记为 @NotTransactional
。这将为您提供对服务方法的更多控制,请注意它不再是事务性的。并且抛出异常后不会清除 GORM 会话。
编辑:
因为您正在调用 .save()
,所以强烈建议在事务内进行。然后您可以使用 withTransaction(Closure)
方法。