3

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

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

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

class Attribute {
    String keyname
}

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

我对 Sets 缺少什么?

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

4

2 回答 2

1

我想通了。我最终不得不像这样覆盖int hashCode()andboolean 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)
}

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

于 2013-01-10T14:07:31.943 回答
0

我同意 aiolos 的观点,最明显的原因是您有多个同名的属性。

您可以防止这种情况使键名唯一

class Attribute {
    String keyname

    static constraints = {
        keyname unique:true
    }
}
于 2013-01-09T14:34:40.790 回答