我认为这是一个简单的hasMany关联 - UserGroup拥有多个用户,而UserGroup由用户拥有:
class UserGroup {
String name
User owner
Set members = []
static hasMany = [members: User]
...
}
到目前为止很好。我希望每个所有者的名称都是唯一的,因此最初对名称设置了约束:
name unique: 'owner'
但是,这也阻止了同名的更新。所以我将约束移到了beforeInsert并且expicitly执行逻辑:
def beforeInsert() {
boolean existing = false
UserGroup.withNewSession {
existing = UserGroup.where {
owner == this.owner && name == this.name
}.count() > 0
}
if (existing) {
this.errors.rejectValue(...)
}
return !this.hasErrors()
}
当保存带有成员的新UserGroup对象并且beforeInsert通过时,我看到hibernate动作为a)插入UserGroup然后b)插入成员。
使用成员保存新的UserGroup对象时,由于名称重复而导致beforeInsert失败,我只看到插入成员的hibernate操作。这当然失败,因为没有父记录。
我做错了什么,或者是否真的是beforeInsert只是杀死了部分save()操作而不是整个事情?怎么办?
答案 0 :(得分:0)
beforeInsert上的代码应该在自定义验证器上,但是它正在检查唯一名称,因此正确的约束应该只是名称唯一:true(不确定名称是唯一的:'所有者'从那以后它无效,值应为boolean,如规范https://docs.grails.org/latest/guide/validation.html)
如果您希望组中的用户以级联方式保存,可以在文档https://docs.grails.org/latest/ref/Database%20Mapping/cascade.html
中指定的映射字段中指定如果自定义验证器失败,或者只有唯一失败,则不应执行级联保存/更新。