【问题标题】:Grails, comparing two objects?Grails,比较两个对象?
【发布时间】:2012-11-15 08:42:33
【问题描述】:

我有一个客户对象。

class Client{
String firstName
String lastName
String middleName
}

然后我有一个母亲不能等于父亲的形式。哪个验证器更适合比较客户端?甚至有区别吗?我都试过了,它们都有效,但我不太确定这是否只是巧合。我也可能是错的。如何对两个对象进行比较?有什么建议吗?

val.id == obj.father.idval == obj.father

class Form{
Client mother
Client father

static constraints = {
mother (nullable:true, validator: { val, obj ->
            if(mother equals father){
                return ["invalid.motherCannotBeEqualFather.label"]  
            }
        })
}
}

【问题讨论】:

标签: grails groovy


【解决方案1】:

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

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

【讨论】:

  • 我的目标是母亲和父亲不应该是同一个对象。我不想在名字上太紧,因为有可能一对夫妇可以共用同一个名字(很少见,但嘿,它发生了today.msnbc.msn.com/id/31994977/ns/today-relationships/t/…)。
  • 简而言之,val.id == obj.father.idval == obj.father 是相同的,只要在同一个休眠会话中检索到母亲和父亲(我很确定)。无论如何,val.id == obj.father.id 将始终有效地区分持久的域对象。我只会使用.id,因为它似乎是您正在寻找的。注意事项:确保在执行验证时对象已被持久化(保存),否则 id 属性将为两者都为空,您最终将得到 null == null //true
  • 是的。在制作文件之前,父母必须事先在场。他们的名字将出现在下拉菜单中,因此如果不存在,则必须先创建它们。我唯一担心的是,假设我们在数据库中有 2 个人,A(id:1) & B(id:2),我成功创建了一个表单。例如,如果 B(id:2) 被删除,并且我添加了一个新客户端 C,那么他的 id 是什么?是2吗?还是会增加到 3?
  • 这取决于,请参阅:stackoverflow.com/questions/6675169/…。简而言之,除非您重新启动数据库,否则 id 将为 3。无论如何,这对于您的目的来说是一个有争议的问题。 id 值保证在持久对象中是唯一的,因此是测试相等性的有效方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-02
  • 2014-01-26
  • 2012-08-17
  • 2014-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多