我有一个父表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仍尝试保存它。
答案 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()