2

Grailsには次の簡略化されたモデルがあります。

  • ADataBlockは、いくつかのソートされたConfigPresetオブジェクトで構成されます。

ConfigPresetには

static belongsTo = [dataBlock: DataBlock]

DataBlockクラスには次のものが含まれます。

List presets
static hasMany = [presets: ConfigPreset]

DataBlock() {
    addToPresets(new ConfigPreset())
}

オーバーロードされたコンストラクターは次を返します。メソッドのシグネチャなし:[...]。addToPresets()は引数タイプに適用可能:(ConfigPreset)値:[ConfigPreset:null]。

しかし、なぜConfigPresetインスタンスがnullなのですか?変更されていないctorを使用してBootStrap.groovyなどでDataBlockオブジェクトを作成し、その上でaddToPresets(...)を呼び出そうとすると、機能します。

4

2 に答える 2

1

Grailsは、初期化コードの起動時に、ドメインクラス(およびその他のアーティファクト)を少なくとも1回インスタンス化します。これは、動的メソッドが追加される前に発生するため、例外です。この時点ですべてが構成されているため、BootStrapで機能します。nullは何もないことに注意してください。名前とIDを出力するドメインクラスのtoString()が表示されているだけで、新しいインスタンスであるため、idはnullです。

ただし、これにはbeforeInsertコールバックを使用できます。http://grails.org/doc/latest/guide/5.%20Object%20Relational%20Mapping%20%28GORM%29.html#5.5.1%20Events%20andを参照してください。 %20Auto%20Timestamping

于 2010-05-07T14:17:47.317 に答える
0

あなたの例はうまくいきません。

static belongsTo = [dataBlock: DataBlock]内部を指定すると、所有者を指定せずにインスタンスをConfigPreset作成することはできません。ConfigPresetDataBlock

したがって、基本的に次のステートメント

new ConfigPreset()nullとは異なり、常に戻ります

new ConfigPreset(dataBlock: aDataBlock)ConfigPreset有効なインスタンスを返します。

メソッドaddToXXXは基本的に次のことを行っています:

  1. XXXインスタンスを作成します(以下で説明します)
  2. 新しく作成されたXXXインスタンスをthisインスタンスに追加します

あなたの場合、インスタンスがまだ作成されていないためConfigPreset(ステップ1)、作成できません(コンストラクター内にあります)DataBlock

DataBlockを作成するたびにConfigPresetを自動的に関連付ける場合は、Gorm Eventsを使用して、beforeInsertイベントにcallbalckを追加することで関連付けることができます。

または、削除belongsToして機能しnew ConfigPreset()ます。

于 2010-05-07T14:21:59.803 に答える