Hibernate中有一个名为unique
的约束,如果某个属性在验证时不是唯一的,则会使某个属性抛出错误。例如:
class Person {
String id
Person mother
Person father
String fullName
// Mapping closure goes here
static constraints = {
father nullable: true
fullName unique: ["mother", "father"]
mother nullable: true
}
}
在这种情况下,只要在fullName
和mother
对中唯一值father
,就允许Person
的任何值。因此,如果有一个id=03 fullName=Liam
的记录,比如id=01 fullName=Olivia
,母亲id=02 fullName=William
和父亲fullName
,那么当另一条记录显示时会出现验证错误同一个id=04 fullName=Liam
id=01 fullName=Olivia
将插入母亲id=02 fullName=William
和父亲null
下。验证工作正常。
问题是当多列唯一约束之一是Person
时。例如,当插入包含母id=03 fullName=Liam
和id=01 fullName=Olivia
null
的记录father
fullName
时,另一条记录具有相同的mother
和{之后插入{1}},验证将不会触发。
我想知道这是否有限制。
P.S。我知道建议在数据库端有这个独特的约束。我已经有了。我想要的是对Hibernate方进行等效检查。
答案 0 :(得分:0)
我目前正在使用自定义验证程序来捕获它(这超出了使用unique
约束的目的)。
fullName unique: ["mother", "father"], validator { val, obj ->
withSession { session ->
Long count = Person.createCriteria().get {
projections {
rowCount()
}
eq("mother", obj.mother)
eq("father", obj.father)
eq("fullName", obj.fullName)
ne("id", obj.id)
}
if(count > 0) {
return ["unique"]
}
}
}
并在message.property
文件中附加此行:
person.fullName.unique=[{0}] with value {2} must be unique.