Grails + GORM:GORM中默认的equals()实现是什么?

时间:2015-02-13 12:53:10

标签: grails gorm grails-2.0 grails-domain-class

当我在Grails中domainObj1 == domainObj2时,对象是通过ID比较的吗?如果没有,他们如何比较?

1 个答案:

答案 0 :(得分:7)

首先,您需要了解GORM / Grails在equals()方面没有做任何特别的事情。除非您在域类上实现自己的equals(),否则它将默认为Java / Groovy实现。默认情况下,变量必须指向同一个实例。

现在,Hibernate让人感到有些困惑。 Hibernate使用identity map(第一级缓存);当你从GORM中获取相同的域实例时,Hibernate实际上会第二次从缓存中返回相同的实例。因此,使两个变量指向同一个实例并显示为相等。

例如:

def something = Something.get(1)
def somethingElse = Something.get(1)
assert (something == somethingElse) // true
something.name = 'I changed this'
assert (something == somethingElse) // still true
something.id = 123 // no idea why you would EVER do this
assert (something == somethingElse) // still true
assert (something.id == somethingElse.id) // true, since it's the same instance!
assert (something.name == somethingElse.name) // true, since it's the same 

即使对实例进行了更改