2

我有一个客户对象。

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"]  
            }
        })
}
}
4

1 回答 1

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'])

考虑只定义一个明确确保您正在寻找的唯一性的验证器。

于 2012-11-16T18:06:24.017 回答