Grails中的组合:构造函数中的addTo *

时间:2010-05-07 11:29:25

标签: grails composition modeling

我在Grails中有以下简化模型:

  • DataBlock由多个已排序的ConfigPreset个对象组成。

在ConfigPreset中我有

static belongsTo = [dataBlock: DataBlock]

并且DataBlock类包含:

List presets
static hasMany = [presets: ConfigPreset]

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

重载的构造函数返回:没有方法签名:[...]。addToPresets()适用于参数类型:(ConfigPreset)值:[ConfigPreset:null]。

但为什么我的ConfigPreset实例为null?如果我尝试在例如中创建一个DataBlock对象BootStrap.groovy带有未经修改的ctor,并在其上调用addToPresets(...),它可以工作。

2 个答案:

答案 0 :(得分:1)

Grails在初始化代码启动期间至少对您的域类(和其他工件)进行一次实例化。这在添加动态方法之前发生,因此是异常。它可以在BootStrap中运行,因为此时已配置了所有内容。注意,什么都不是null - 你只是看到域类的toString()打印名称和id,因为它是一个新的实例,id是null。

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

答案 1 :(得分:0)

你的例子无法运作。

static belongsTo = [dataBlock: DataBlock]中指定ConfigPreset表示如果未指定ConfigPreset所有者,则无法创建DataBlock个实例。

所以基本上是以下陈述

不同,

new ConfigPreset()将始终返回null

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

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

  1. 创建XXX实例(如下所述)
  2. 将新创建的XXX实例添加到this实例
  3. 在您的情况下,它无法创建ConfigPreset(步骤1),因为尚未创建DataBlock实例(您在构造函数中)

    如果要在创建DataBlock时自动关联ConfigPreset,可以使用Gorm Events,向beforeInsert事件添加callbalck来实现。

    或者您可以删除belongsTonew ConfigPreset()也可以。