Grails + GORM:GORM 中默认的 equals() 实现是什么?
Grails + GORM: What is the default equals() implementation in GORM?
当我在 Grails 中执行 domainObj1 == domainObj2
时,是否按 ID 比较对象?如果不是,它们是如何比较的?
首先,您需要了解 GORM/Grails 对于 equals()
没有做任何特别的事情。除非您在您的域 class 上实现自己的 equals()
,否则它将默认为 Java/Groovy 实现。默认情况下,这意味着变量必须指向同一个实例。
现在,有点令人困惑的是 Hibernate。 Hibernate使用了一个identity map(一级缓存);当您从 GORM 获取相同的域实例时,Hibernate 实际上会 return 第二次从缓存中获取相同的实例。从而使两个变量指向同一个实例并显示为相等。
例如:
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
即使对实例进行了更改
当我在 Grails 中执行 domainObj1 == domainObj2
时,是否按 ID 比较对象?如果不是,它们是如何比较的?
首先,您需要了解 GORM/Grails 对于 equals()
没有做任何特别的事情。除非您在您的域 class 上实现自己的 equals()
,否则它将默认为 Java/Groovy 实现。默认情况下,这意味着变量必须指向同一个实例。
现在,有点令人困惑的是 Hibernate。 Hibernate使用了一个identity map(一级缓存);当您从 GORM 获取相同的域实例时,Hibernate 实际上会 return 第二次从缓存中获取相同的实例。从而使两个变量指向同一个实例并显示为相等。
例如:
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
即使对实例进行了更改