grails - 等于grails中的域类

标签 grails gorm

以下等于代码的域返回错误结果

boolean equals(o) {
  if (o == null) return false
  if (this.is(o)) return true
  getClass() == o.class && id == o.id
}

对于两个具有相同ID的已加载实体,返回false。 Id等于(DB中的一条记录)。但是类(class)不一样。

实体-另一个域中的字段。看起来GORM使用了一些包装器类。

如何避免这种问题?

最佳答案

如您所见,要求类相同是非常严格的。使用instanceof通常更安全,例如

class Foo {
    boolean equals(o) {
        if (!o) return false
        if (is(o)) return true
        o instanceof Foo && id == o.id
    }
}

通常,在域类中使用idequals中的hashCode是一个坏主意,因为您无法比较持久性和非持久性类。例如
class Foo {
    String name
    boolean equals(o) {
        if (!o) return false
        if (is(o)) return true
        o instanceof Foo && id == o.id
    }
}

使用此类,这将失败:
new Foo(name: 'foo').save()
assert Foo.findByName('foo') == new Foo(name: 'foo')

但在这两种情况下,所有重要的类数据(在本例中仅为name属性)都相同。

更糟糕的是,假设您创建了一个类似破烂的hashCode方法,如果您将一个非持久性实例添加到基于哈希的集合(例如HashSet)中,然后将其保存,其id将从null更改为某个long值,因此其哈希码值。这将导致实例在集合中变得“丢失”。

关于grails - 等于grails中的域类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29500317/

相关文章:

grails - 如何在grails域类中获取hasMany实例属性的平均值?

hibernate - Grails事务问题IllegalStateException key BasicDataSource TransactionSynchronizationManager.bindResource的已有值

grails - 从每种搜索方法中忽略 “Inactive”条目

list - 从gsp向 Controller 传递多个值以保存很多到很多

grails - Grails/GORM中的旧版映射:1:N关系中的一个域类和两个表

grails - 跨多个域类的Grails过滤和排序

grails - 在Grails中,如何从 Controller 返回到调用当前 View ?

grails - 在Grails中映射两个域类

grails - 验证后对象没有持久化,没有错误

grails - 将多个选定的下拉值保存到Grails中的单个列中