我有一个父对象,只有在子对象有效时才能创建。 。子节点在保存后只能通过id引用父节点(因为id是自动递增的)。所以我保存父母,然后将父母分配给要保存的孩子。 如果一个孩子无法保存,如何回滚所有父保存和已发生的子保存?
(这是在服务层进行的)
parent.save(flush:true);
children.each{child->
child.parent=parent;
if(!child.save(flush:true)){
//how to roll back all previous child saves if any AND
//initial parent save also
}
}
答案 0 :(得分:2)
如果在事务服务中抛出未捕获的异常,事务将回滚所有内容。像这样:
package com.example
class MyService {
static transactional = true
void myMethod() {
parent.save(flush:true)
children.each{child->
child.parent = parent
if(!child.save(flush:true)){
throw new RuntimeException('Rollback')
}
}
}
}
我个人不会在生产代码中使用RuntimeException
。我创建了自己的异常,并避免在这种情况下填写堆栈跟踪。但是,出于示例目的,上面演示了您想要做的事情。