1

我有一个父表 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()

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

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

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

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

当孩子无效时,我该如何解决?我需要将有关错误的信息传播到视图表单。

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

4

2 回答 2

1

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

static belongsTo = [Parent]

在 Child 类中并再次保存,如果您仍然没有看到 Child 验证发生,也可能使用deepValidate:true 。

于 2012-11-04T23:01:15.217 回答
-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()
于 2015-08-12T06:51:39.850 回答