如果我有域名人员和域名爱好,而且有很多爱好,我怎样才能确保同一个爱好不会多次添加到人员收藏中。
即。
之类的东西`
class Hobby {
String name
static belongsTo = [person: Person]
}
class Person
String name
static hasMany =[hobby: Hobby]
static constraints= {
hobby.name unique: true //like this
}
}
答案 0 :(得分:5)
我知道这已经得到了回答,但最简单的方法就是这样做:
class Hobby {
String name
static belongsTo = [person: Person]
static constraints = {
name unique: 'person'
}
}
这将确保hobby
的父级person
具有唯一的名称。无需自定义验证器。
答案 1 :(得分:1)
这是自定义validator
的完美用例。我建议你阅读documentation,这样你就可以感受到它的可能性,但你可以使用这样的东西:
class Hobby {
String name
static belongsTo = [person: Person]
}
class Person
String name
static hasMany = [hobby: Hobby]
static constraints = {
hobby validator: { val, obj ->
if (obj.hobby.find{ (it.name.equals(val.name) && it.id != val.id) } ) return ['unique']
}
}
}
以上只是我的头脑,可能存在拼写错误或逻辑错误,但这是一个如何使用自定义validator
实现自己检查的示例。
<强>更新强>
Gregg关于使每个Hobby
Person
唯一的答案实际上是解决这个问题的一种更简单,更简洁的方法。正如他指出的那样,实际上不需要自定义验证器,因为Person
和Hobby
之间存在关系。
答案 2 :(得分:0)
文档(http://docs.grails.org/2.5.5/guide/GORM.html#sets,ListsAndMaps)表示使用hasMany
定义的集合是java.util.Set
。而Set
不能包含重复项。
所以我认为您不必定义约束,默认情况下您有所请求的行为。