当子实体包含无效数据时,Grails无法处理一对一关系

时间:2012-11-04 15:56:41

标签: grails gorm

我有一个父表Parent和一个子表Child。关系是这样的:

class Parent {
   ...
   Child child

   static mapping = {
      child lazy: false, cascade: 'all'
   }
   static constraints = { ... }
}

class Child {
   String name

   static constraints = {
      name unique: true
   }
}

我创建了一些代码来将子项添加到现有父项。它看起来像这样:

def parent = Parent.get(id)
parent.child = new Child(name: (name))
parent.save()

此代码包含在事务服务方法中。

当孩子无效时它不起作用 - 没有验证发生。我得到了一个着名的休眠错误:

  

对象引用未保存的瞬态实例 - 保存瞬态实例   在冲洗之前。

可以很容易地解释:未验证子项,当GORM保存对象时,它会尝试保存子项,然后它应该由于失败而停止,但它会继续并尝试使用未保存的子字段保存父项。

如果孩子无效,我该如何处理这个案子?我需要将有关错误的信息传播到视图表单。

我已经尝试手动验证子级 - 它的错误字段包含1个错误,但父级仍然有效。我试图将错误插入父错误字段 - 父错误变为无效,但GORM仍尝试保存它。

2 个答案:

答案 0 :(得分:1)

您在Child和Parent之间的关系中是否定义了 belongsTo (例如static belongsTo = [Parent])?如果不这样做,Grails将不会将保存/更新从父级保存到子级,因为它不“拥有”子级 - 因此如果子级上没有发生保存,则永远不会调用验证。所以尝试添加

static belongsTo = [Parent]

在Child类中并再次保存,如果您仍未看到Child验证发生,可能还会使用deepValidate:true

答案 1 :(得分:-1)

谢谢你这个很好的答案我面临同样的问题,因为你的帖子我解决了问题

def val = (params.company).toInteger()
def parent = Company.get(val)
        .addToJobs(new Job(
            experience:params.months,
            jobdescription:params.desc,
            joblocation:params.companyloc,
            jobskills:params.skills,
            jobtype:params.emp,
            salary:params.jobsalary,
            jobtitle:params.jobtitle))
        .save()