2

次のように定義された MyParameterクラスとクラスがありMyParameterValueます。

class MyParameter {
  MyParameterValue defaultValue

  static belongsTo = [anotherObject: AnotherDomainClass]
}

class MyParameterValue {
  MyParameter valueOf
}

私の問題は、 GORMがこれをバックリファレンスとの1対1の関係として扱うことを主張していることです。これは、私が望んでいることではありません。これは、パラメーターの更新方法に影響を及ぼします。

例:

    def param = new MyParameter(defaultValue: new MyParameterValue()).save()
    def paramVal = new MyParameterValue (valueOf: param).save()
    assert param.defaultValue != paramVal

このコードはをスローしAssertionFailureます。どうしたの?2行目のデフォルト値を変更するつもりはなかったことは明らかですがparam、GORMは、で同期する必要があるかのように更新しdefaultValueます。valueOfMyParameterValue

したがって、GORMは実際に私が望むものを変換します:

反対方向の2つの参照のUMLの例

その中に:

両面1対1関係のUMLの例

これが私の2つの質問です:

  • hasOneタイプの観点からは後方参照のように見えるすべての参照が、とにかく1対1の関係として扱われる場合、キーワードの目的は何ですか?
  • valueOfGORMをのバックリファレンスとして扱わないように強制するにはどうすればよいdefaultValueですか?カスケード動作を変更したくないことに注意してください。の変更はカスケードdefaultValueするMyParameter必要があります。

アップデート

私はまだ上記の質問への答えに興味があります。私が使用した解決策は、デフォルト値に独自のクラスを与えることでしたMyDefaultValue。ご想像のとおり、これMyParameterValueは複雑な構造であり、この構造の重複を避ける方法を探していました。

4

1 に答える 1

0

後方参照は必要ないが、すべてのリレーションを手動で処理したい場合は、次のようにオブジェクトを定義すると思います。

class MyParameter {
  MyParameterValue defaultValue

  static constraints {
     defaultValue nullable: true
  }
}

class MyParameterValue {
  MyParameter valueOf

  static constraints {
     valueOf nullable: true
  }
}

ただし、これには、すべての配管を自分で行う必要があります。

于 2012-04-06T06:39:40.477 に答える