我在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(...),它可以工作。
答案 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
基本上是在执行以下操作:
this
实例在您的情况下,它无法创建ConfigPreset
(步骤1),因为尚未创建DataBlock
实例(您在构造函数中)
如果要在创建DataBlock时自动关联ConfigPreset,可以使用Gorm Events,向beforeInsert事件添加callbalck来实现。
或者您可以删除belongsTo
,new ConfigPreset()
也可以。