我现在还不太明白我的代码中发生了什么。根据我的理解,一个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的副本。答案 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
}
}