3

現在、コードで何が起こっているのかよくわかりません。私が理解していることから、グルーヴィーなセットには重複が含まれていません。ただし、セット内に重複があり、データベースに重複が残っていることもわかります。データベースから取得した場合でも、重複はセットに含まれていません。

私には2つのクラスがあります(簡潔にするためにいくつかのプロパティが削除されています):

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

class Attribute {
    String keyname
}

私のサービスでは、を使用してEntityTypeに追加される属性のjsonarrayを渡しますtype.addToAttributes(attr)。同じ呼び出しを複数回実行すると、重複がセットに追加されます。そして、永続化するとき、重複は永続化されます。ただし、データベースからセットを取得すると、重複することなくセットが取得されます。したがって、最終的な結果は、データベーステーブルを不要なデータで埋める以外に何も害を及ぼさないように見えるということです。

セットについて何が欠けていますか?

編集:これは私がちょうど気づいた奇妙な何かです。すべての属性に対して重複が作成されるわけではありません。n-1個の複製のみが作成されます。属性jsonarryを反復処理する場合、最初の属性は複製されませんが、その後は複製されます。したがって、私の配列が{a:1、b:2、c:3}の場合、bとcの複製のみが作成されます。

4

2 に答える 2

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)
}

新しいプロパティを追加するとこれらのメソッドを更新する必要があるため、これはあまり好きではありませんが、今のところは機能します。

于 2013-01-10T14:07:31.943 に答える
0

最も明白な理由は、同じ名前の複数の属性があることであるというaiolosに同意します。

これにより、キー名が一意になるのを防ぐことができます

class Attribute {
    String keyname

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