4

次のような Domain クラスがあります。

class Attribute {
  List attributeParameters = []
  static hasMany = [attributeParameters: AttributeParameter]
}

AttributeParameterに属しAttributeます。ここには他にもいくつかの関係が定義されており、多くの属性にわたっていくつかの AttributeParameters を削除する必要があるインスタンスがあります。だから私たちはこれをやっています:

def parameters = AttributeParameter.findAllBySomeOtherCriteria(foo)
parameters*.delete()

それはうまくいきますが、attribute_parameter にattribute_parameters_idxは順序が狂う列があります。コレクションを List として定義したため、この列が存在します。そしてattribute.removeFromAttributeParameters(ap)、そうすると、Grails はこの列を自動的に調整します。しかし、そのようにデータを削除していないため、データは順不同になります。

これが発生すると、Attribute からコレクションをループすると null 値が返されます。これはキャッシュの問題でも、親の問題の更新でもありません。何が起こるかは、次の場合です。

attribute.attributeParameters.each { }

_idx 値に基づいて、内部で何かが繰り返しに追加の行を追加しています。これらの行の 1 つ (または複数) が欠落しているため、Grails は Collection に null 行を追加しています。デバッグ中はこれを確認できませんが、反復が発生するにつれて確認できます。

最後に、私の質問は次のとおりです。

  • 特定のコレクションの _idx 値を更新するように Grails に指示する方法はありますか?
  • この _idx 列を取得し、Gorm を介してその値を手動で変更する方法はありますか
4

1 に答える 1

0

これは、Hibernate がコレクション、特に List のようなインデックス付きのコレクションを処理する方法に帰着すると思います。使用しないaddToと、removeFromHibernate はインデックスを更新する必要があることを知りません。

回避策として、次のようなことが考えられます。

afterDeleteクラスにイベントを追加しますAttributeParameter。その中で、次のようなものが必要になります。

def afterDelete() {
    def sql = new Sql(dataSource)
    sql.execute("update attribute_attribute_parameter set attribute_parameter_idx = " +
    "attribute_parameter_idx - 1 where attribute_parameter_idx > " +
    "(select attribute_parameter_idx from attribute_attribute_parameter where " +
    "attribute_parameter_id = $id and attribute_id = $attribute.id) " +
    "and attribute_id = $attribute.id")
}

PS。getIndexColumnName()非公開ですが、インデックス列名を動的に取得するために使用できると思います。

于 2012-12-11T21:13:02.400 に答える