[英]Validate instance of domain class is unique
我有一个带有一堆域类的Grails应用程序,其中一些域类很多,其中一些与所讨论的域类具有hasMany
关系。 对于此特定应用程序,我只有一个“约束”,即每个域类的每个实例都必须是唯一的。 我不在乎任意字段在同一域类的多个实例中是否具有相同的值,只要该域类中某个其他域的值使每个实例具有唯一性即可。 因此,基本上,我希望验证在域类实例级别而不是域类字段级别进行。 现在,我通过使用非常@EqualsAndHashCode
批注生成我的equals
和hashCode
方法,然后在域类的任意字段的自定义验证器中调用equals
来做到这一点。
两个问题:
@groovy.transform.EqualsAndHashCode class MyDomainClass { String some int arbitrary boolean field static constraints = { // The field I chose to validate on is irrelivant, I just need to run the validation code **somewhere** arbitrary validator: { val, obj -> return !MyDomainClass.getAll().contains(obj) } } }
我还应该补充一点,我正在寻找一种通用的(希望高效)的方法。 我意识到,调用getAll()
效率很低,相反,调用find
某种变体或对每个域类的确切字段执行HQL查询将更加高效……这只花了更长的时间!
例子
assert MyDomainClass.getAll().isEmpty() // true
def myDomainClass1 = new MyDomainClass( some: "foo", arbitrary: 1, field: true)
assert MyDomainClass.getAll().contains(myDomainClass1); // false
myDomainClass1.save(flush:true)
def myDomainClass2 = new MyDomainClass( some: "bar", arbitrary: 1, field: true)
assert MyDomainClass.getAll().contains(myDomainClass2); // false. Even though this has the same `arbitrary` value as myDomianClass1, it has a different `some` value which makes it unique.
myDomainClass2.save(flush:true)
def myDomainClass3 = new MyDomainClass( some: "foo", arbitrary: 1, field: false)
assert MyDomainClass.getAll().contains(myDomainClass3); // false. Even though this has the same `some` value as myDomainClass1 and the same `arbitrary` value as myDomainClass1 and myDomainClass2, it has a different `field` value which makes it unique.
myDomainClass3.save(flush:true)
这将确保域中3个字段的组合是唯一的。 这还可以确保约束位于数据库级别,而不只是应用程序级别。
class MyDomainClass {
String some
int arbitrary
boolean field
static constraints = {
some(unique: ['arbitrary', 'field'])
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.