2010-05-07 48 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