我应该在域类中实现equals和hashCode吗?

时间:2015-04-16 18:53:56

标签: grails

所有Grails域类都应该实现equals()hashCode()吗?是否有Grails提供的默认值?

似乎不应该这样,因为总有一个id。

1 个答案:

答案 0 :(得分:17)

在Grails Book“Programming Grails”中,Burt谈到了equals& hashCode(我希望我能在这里得到它),它们应该在代理使用的场景中实现(比如在进行延迟加载或Customer.load()时)并存储在集合中。因为如果代理实体以及未代理的实体存储在集合中,则它们不会被视为“相同”对象。

由于Hibernate通常使用非代理版本的域实例,如果它已经在第一级缓存(Hibernate会话)中,只有当你有一个域对象,而不是当前的hibernate会话时才会出现这个问题(比如http会话)。

如果您想避免那么多样板代码,可以使用注释@EqualsAndHashCode(参见docs),如下所示:

@EqualsAndHashCode(includes='firstName,lastName')
class Customer {
  String customerId
  String firstName
  String lastName
}

有关详细信息,请参阅“编程Grails - Burt Beckwith”第一版,第134页。