所有Grails域类都应该实现equals()
和hashCode()
吗?是否有Grails提供的默认值?
似乎不应该这样,因为总有一个id。
答案 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页。