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



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

似乎不需要这样做,因为总有一个 id。

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

由于 Hibernate 通常使用域实例的非代理版本(如果它已经在一级缓存(休眠会话)中),因此仅当您有一个不在当前休眠会话(如 http 会话)中的域对象时,才会发生此问题。

如果要避免太多样板代码,可以使用注释@EqualsAndHashCode(请参阅文档),如下所示:

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

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