grails (gorm) 集包含并保留重复项

标签 grails grails-orm

我现在不太明白我的代码中发生了什么。据我了解,常规集不包含重复项。但是,我在一组中看到重复项,并且还看到重复项保存到数据库中。虽然从数据库中检索时,重复项不在集合中。

我有两个类(为简洁起见删除了一些属性):

class EntityType {
    static hasMany = [attributes: Attribute]
}

class Attribute {
    String keyname
}

在我的服务中,我传入了一个 jsonarray 属性,这些属性使用 type.addToAttributes(attr) 添加到 EntityType。如果我多次执行同一个调用,则会将重复项添加到 Set 中。并且在持久化时,重复项被持久化。但是,当我从数据库中检索 Set 时,检索到的 Set 没有任何重复项。所以最终的结果是,除了用不必要的数据填充数据库表之外,它似乎没有任何伤害。

关于 Sets 我错过了什么?

编辑:这是我刚刚注意到的一些奇怪的事情。不会为所有属性创建副本。仅创建 n-1 个重复项。当遍历属性 jsonarry 时,第一个属性不会重复,但之后的每个属性都会重复。因此,如果我的数组是 {a:1,b:2,c:3},它只会创建 b 和 c 的副本。

最佳答案

我想通了。我最终不得不重写 int hashCode()boolean equals(Object o) 方法:

@Override
int hashCode() {
    return keyname.hashCode() + id.hashCode()
}

@Override
boolean equals(Object o) {
    Attribute other = o as Attribute
    return keyname.equals(other.keyname) && id.equals(other.id)
}

虽然我不太喜欢这个,因为如果我添加新属性,它会迫使我更新这些方法,但它现在可以工作。

关于grails (gorm) 集包含并保留重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14237140/

相关文章:

grails - Grails 2.5.4 中的 GORM 触发模式

hibernate - GORM查询过滤器不是类的直接属性

Grails 中定义的映射属性有很多关系

spring - Grails:在某些路径上禁用 Spring Security Core

grails - 如何获得grails test-app在运行后保留类文件?

grails - Bootstrap不保存实体

grails - Grails 集成测试名副其实吗?

java - Hibernate - 如何在一个查询中获取对象列表的属性

grails - 如何使用 metaClass 和 invokeMethod 实现委托(delegate)?

java - 排除从 Grails 中的查询中检索 'id'