Grails + GORM : What is the default equals() implementation in GORM?

标签 grails grails-orm grails-2.0 grails-domain-class

当我在 Grails 中执行 domainObj1 == domainObj2 时,对象是按 ID 进行比较的吗?如果不是,如何比较?

最佳答案

首先,您需要了解 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 

即使对实例进行了更改

关于Grails + GORM : What is the default equals() implementation in GORM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28500091/

相关文章:

grails - 如何在子查询中实现计数

java - 在 Java 或 Groovy 中转换 UTC 时间 T0 本地时间

grails - Multi-Tenancy - 动态注册 JNDI 数据源

Grails/Groovy 域类继承转换

grails - 如果我的域类中没有链接字段,如何将表与 grails 中的条件连接起来

grails - 保存相关实体

grails - 如何使用Grails WebXmlConfig插件将属性添加到WEB.XML文件?

grails - 通过 grails spring security facebook 插件登录后重定向?

grails - 动态设置 Grails 应用程序上下文?

mysql - 如何在带有 Gorm 的 Grails 中使用 GROUP_CONCAT