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

Should I implement equals and hashCode in a domain class?

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

似乎不​​需要这个,因为总是有一个 id。

在 Grails 书中 "Programming Grails" Burt 谈到 equals 和 hashCode(我希望我在这里理解正确),它们应该在代理使用场景中实现(比如在进行延迟加载时或 Customer.load()) 并存储在一个集合中。因为如果代理实体和非代理实体都存储在集合中,则它们不会被视为 "same" 对象。

如果域实例已经在一级缓存(Hibernate 会话)中,Hibernate 通常使用域实例的非代理版本,只有当您有域对象时才会出现此问题,该域对象不在当前休眠会话(如 http 会话)。

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

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

有关详细信息,请参阅 "Programming Grails - Burt Beckwith" 第一版,第 134 页。