我有一个ClientAttribute域类,有两个字段:name (String)
& project (Project)
。
Project
和ClientAttribute
之间存在一对多的关系。在单个项目中,所有名称都必须是唯一的。
起初我考虑过创建以下验证器:
name(blank: false, validator: { val, obj ->
if (ClientAttribute.findByProjectAndName(obj.project, val)) return ['clientAttribute.name.unique']
})
不幸的是,在创建ClientAttribute
的新实例时,我是通过向项目实例上的clientAttributes
字段添加新实例并保存项目实例来实现的。这反过来又保存了集clientAttributes
中的其余对象。在集合中保存第二个对象时,会触发验证程序,并且它会抛出一个错误,因为findBy()
方法返回相同的对象。
我想知道,执行此类检查的正确方法是什么? 我可以修改查询,不要返回我正在保存的同一个对象,但我想知道我的问题是否没有更简单的解决方案?
由于
答案 0 :(得分:1)
也许我不了解您的域模型,但是什么阻止您在项目和名称的ClientAttribute中使用Grails Unique Constraint?像这样:
name blank: false, unique: 'project'