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

时间:2013-01-09 14:12:20

标签: grails gorm

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

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

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

class Attribute {
    String keyname
}

在我的服务中,我传入一个jsonarray属性,使用type.addToAttributes(attr)添加到EntityType。如果我多次执行同一个调用,则会将重复项添加到Set中。当坚持不懈时,重复的内容会持续存在。但是,当我从数据库中检索Set时,将检索Set而不重复任何内容。因此,最终的结果是,除了用不必要的数据填充数据库表之外,它似乎没有任何损害。

我对集合缺少什么?

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

2 个答案:

答案 0 :(得分:1)

我想出来了。我最终不得不覆盖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)
}

虽然我不喜欢这个,因为它强迫我在添加新属性时更新这些方法,但它现在可以使用。

答案 1 :(得分:0)

我同意aiolos,最明显的原因是你有多个具有相同名称的属性。

你可以阻止这使得keyname唯一

class Attribute {
    String keyname

    static constraints = {
        keyname unique:true
    }
}