Grails从父域模型更新一对多

时间:2014-12-13 08:38:50

标签: grails

我正在从控制器中的父域模型更新一对多。

代码如下所示:

def update() {

   def parentInstance = Parent.get(params.id)

   params.childerenDetails.each {

      parentInstance.addToChildrens(
         newChildren(
            name:params.get(name_"${it}"),
            age:params.get(age_"${it}"))
      }
   }

   if(parentInstance.validate()) {
      parentInstance.save(flush:true)
   } else {
      render "error found at"+parentInstance.errors
   }
}

....这里我在父类中进行自定义验证时添加子值获取父验证错误但子对象正在保存到db ..如果要防止验证错误出现在父域中

1 个答案:

答案 0 :(得分:0)

如果要阻止子项存储到数据库中,您需要将此代码移动到Service,默认情况下是事务性的,或者将所有代码封装在Parent.withTransaction { // }中。如果您选择使用该服务,则在检测到验证错误时可以抛出RuntimeException以强制回滚。如果您使用withTransaction,则可以使用status.setRollbackOnly手动回滚它:

def parentInstance = Parent.get(params.id)
Parent.withTransaction { status ->
   params.childerenDetails.each {

     parentInstance.addToChildrens(
        newChildren(
           name:params.get(name_"${it}"),
           age:params.get(age_"${it}"))
       }
   }

   if(parentInstance.validate()) {
      parentInstance.save(flush:true)
   } else {
     status.setRollbackOnly()
   }
}

不确定parentInstance.save(flush: true, failOnError: true)是否也会触发回滚。 我宁愿将业务逻辑移动到服务。请参阅参考指南中的withTransactionServices文档。