我应该在域 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 页。
所有 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 页。