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 实例为空?如果我尝试使用未修改的 ctor 在例如 BootStrap.groovy 中创建一个 DataBlock 对象并在其上调用 addToPresets(...) ,它就可以工作。

4

2 回答 2

1

Grails 在启动期间为其初始化代码实例化您的域类(和其他工件)至少一次。这发生在添加动态方法之前,因此例外。它在 BootStrap 中工作,因为此时一切都已配置。请注意,没有什么是空的 - 您只是看到打印名称和 id 的域类的 toString() ,并且由于它是一个新实例,因此 id 为空。

您可以为此使用 beforeInsert 回调,请参阅 - http://grails.org/doc/latest/guide/5.%20Object%20Relational%20Mapping%20%28GORM%29.html#5.5.1%20Events%20and %20自动%20时间戳

于 2010-05-07T14:17:47.317 回答
0

你的例子行不通。

指定static belongsTo = [dataBlock: DataBlock]insideConfigPreset意味着您不能在ConfigPreset不指定DataBlock所有者的情况下创建实例。

所以基本上下面的语句

new ConfigPreset()将永远返回null不同

new ConfigPreset(dataBlock: aDataBlock)这将返回一个有效的ConfigPreset实例。

该方法addToXXX基本上是在执行以下操作:

  1. 创建 XXX 实例(如下所述)
  2. 将新创建的 XXX 实例添加到this实例

在您的情况下,它无法创建ConfigPreset(步骤 1),因为DataBlock尚未创建实例(您在构造函数中)

如果您想在创建 DataBlock 时自动关联一个 ConfigPreset,您可以使用 Gorm 事件来实现,在beforeInsert事件中添加一个回调函数。

或者您可以删除belongsTo并且new ConfigPreset()将工作。

于 2010-05-07T14:21:59.803 回答