【问题标题】:Grails + GORM: What is the default equals() implementation in GORM?Grails + GORM:GORM 中默认的 equals() 实现是什么?
【发布时间】:2015-04-14 12:34:32
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    即使对实例进行了更改

    【讨论】:

      猜你喜欢
      • 2012-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-29
      • 1970-01-01
      • 2021-11-18
      相关资源
      最近更新 更多