Grails:仅在所有通过验证时将父级和子级保存到数据库的方法

时间:2016-05-03 19:53:07

标签: grails gorm

我有一个父对象,只有在子对象有效时才能创建。 。子节点在保存后只能通过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
     }
 }

1 个答案:

答案 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。我创建了自己的异常,并避免在这种情况下填写堆栈跟踪。但是,出于示例目的,上面演示了您想要做的事情。