我有一个客户端对象。
class Client{
String firstName
String lastName
String middleName
}
然后我有一个母亲不能与父亲相等的形式。哪个验证器更适合比较客户端?甚至还有区别吗?我已经尝试了两种并且它们有效,但我不太确定它是否只是巧合。我也错了。如何比较两个对象?有什么建议吗?
val.id == obj.father.id
或val == obj.father
class Form{
Client mother
Client father
static constraints = {
mother (nullable:true, validator: { val, obj ->
if(mother equals father){
return ["invalid.motherCannotBeEqualFather.label"]
}
})
}
}
答案 0 :(得分:2)
val == obj.father
将导致val.equals(obj.father)
,因为Groovy重载==。这样做的默认行为是简单地检查引用相等性,这可能是危险的。 Hibernate将尝试确保平等(参见Fabiano的链接),但它可能不可靠。
val.id == obj.father.id
确保两个对象表示与域对象关联的数据库表中的不同条目。保存新域对象时,Grails会为对象分配一个在其域中唯一的ID。默认情况下,这是通过表示对象的DB表中的递增id来完成的。
如果在执行此验证时已将母亲和父亲保存到数据库中,则可能是有用的相等检查。
如果你只是试图阻止firstName,lastName和middleName在一个表单上是相同的,这似乎是这样的,只有你在这些字段中定义了唯一性限制时,这个验证才会有效。客户域,例如firstName(unique: ['lastName', 'middleName'])
。
考虑定义一个明确确保您正在寻找的唯一性的验证器。