Grails,比较两个对象?

Grails,比较两个对象?,grails,groovy,Grails,Groovy,我有一个客户端对象 class Client{ String firstName String lastName String middleName } 然后我有一种形式,母亲不能和父亲平等。哪个验证器更适合比较客户机?有什么区别吗?我试过两种方法,它们都有效,但我不太确定这是否只是巧合。我也可能错了。如何对两个对象进行比较?有什么建议吗 val.id==obj.father.id或val==obj.father class Form{ Client mother Client father

我有一个客户端对象

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

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"]  
            }
        })
}
}
将导致
val.equals(obj.father)
,因为Groovy重载==。此操作的默认行为是简单地检查引用相等,这可能是危险的。Hibernate将尝试确保平等(参见Fabiano的链接),但它可能不可靠

val.id==obj.father.id

将确保这两个对象代表与域对象关联的数据库表中的不同条目。保存新域对象时,Grails会为该对象分配一个在其域内唯一的id。默认情况下,这是通过DB表中表示对象的递增id来完成的

如果在执行此验证时母亲和父亲已经保存到数据库中,则这可能是一个有用的平等性检查

如果您只是试图防止表单上的firstName、lastName和middleName看起来是一样的,那么只有在客户机域中将这些字段定义为组时,此验证才会有效,例如
firstName(unique:['lastName','middleName'])


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

我的目标是母亲和父亲不应该是同一个对象。我不想对名字太过严格,因为有一种可能性,一对夫妇可能会共用同一个名字(这种情况很少见,但很常见)。简言之,
val.id==obj.father.id
val==obj.father
是一样的,只要在同一个休眠会话中检索到母亲和父亲(我很确定)。不管怎样,
val.id==obj.father.id
将始终有效地区分持久化域对象。我只想使用
.id
,因为它似乎就是您要找的。注意:在执行验证时,请确保对象已被持久化(保存),否则,这两个对象的id属性都将为null,并且最终结果为
null==null//true
yes。。在制作文件之前,母亲和父亲必须亲自到场。他们的名字会出现在下拉菜单中,所以如果没有,就必须先创建他们。我唯一担心的是,假设数据库中有两个人,A(id:1)和B(id:2),我成功地创建了一个表单。例如,如果删除了B(id:2),我添加了一个新的客户机C,他的id是什么?是2号吗?还是会增加到3?这取决于具体情况,请参见:。简而言之,除非重新启动数据库,否则id将为3。不管怎样,这对你来说是一个没有意义的观点。id值在持久化对象中保证是唯一的,因此是测试相等性的有效方法