我现在不太明白我的代码中发生了什么。据我了解,常规集不包含重复项。但是,我在一组中看到重复项,并且还看到重复项保存到数据库中。虽然从数据库中检索时,重复项不在集合中。
我有两个类(为简洁起见删除了一些属性):
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/