Grails 3 beforeInsert()没有停止相关的插入?

时间:2016-12-20 14:04:19

标签: hibernate grails gorm has-many

我认为这是一个简单的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()操作而不是整个事情?怎么办?

1 个答案:

答案 0 :(得分:0)

beforeInsert上的代码应该在自定义验证器上,但是它正在检查唯一名称,因此正确的约束应该只是名称唯一:true(不确定名称是唯一的:'所有者'从那以后它无效,值应为boolean,如规范https://docs.grails.org/latest/guide/validation.html

如果您希望组中的用户以级联方式保存,可以在文档https://docs.grails.org/latest/ref/Database%20Mapping/cascade.html

中指定的映射字段中指定

如果自定义验证器失败,或者只有唯一失败,则不应执行级联保存/更新。