所有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页。