2010-05-07 65 views
2

我在Grails的下面簡化模型:組成Grails中:AddTo就*在構造

  • DataBlock由多個排序ConfigPreset對象組成。

在ConfigPreset我

static belongsTo = [dataBlock: DataBlock] 

和數據塊類包含:

List presets 
static hasMany = [presets: ConfigPreset] 

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

重載的構造函數返回:法無簽名:[...] addToPresets()時。適用於參數類型:(ConfigPreset)值:[ConfigPreset:null]。

但爲什麼我的ConfigPreset實例爲空?如果我嘗試在例如創建一個DataBlock對象BootStrap.groovy與未修改的ctor並調用addToPresets(...),它的工作原理。

回答

0

你舉的例子不能工作。

指定static belongsTo = [dataBlock: DataBlock]ConfigPreset意味着你不能沒有指定DataBlock所有者創建一個ConfigPreset實例。

所以基本上下面的語句

new ConfigPreset()總是返回null不像

new ConfigPreset(dataBlock: aDataBlock),將返回一個有效ConfigPreset實例。

方法addToXXX,基本上是做了以下內容:

  1. 創建XXX實例(如下文所述)
  2. 新創建XXX實例添加到this例如

在你的情況,它不能創建ConfigPreset(步驟1),因爲DataBlock實例尚未創建(您在構造函數中)

如果您希望在創建數據塊時自動關聯ConfigPreset,則可以使用Gorm Events添加呼叫塊到beforeInsert事件。

或者您可以刪除belongsTonew ConfigPreset()將工作。

1

Grails在初始化代碼的啓動過程中至少一次實例化您的域類(和其他工件)。這發生在添加動態方法之前,因此是例外。它在BootStrap中起作用,因爲此時已配置了所有內容。請注意,沒有任何內容爲空 - 您只會看到打印名稱和標識的域類的toString(),並且由於它是新實例,因此標識爲空。

可以使用beforeInsert回調這雖然見 - http://grails.org/doc/latest/guide/5.%20Object%20Relational%20Mapping%20%28GORM%29.html#5.5.1%20Events%20and%20Auto%20Timestamping