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

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

  • 在ConfigPreset中,我有
    static belongsTo = [dataBlock: DataBlock]
    

    并且DataBlock类包含:
    List presets
    static hasMany = [presets: ConfigPreset]
    
    DataBlock() {
        addToPresets(new ConfigPreset())
    }
    

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

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

    最佳答案

    您的示例不起作用。

    static belongsTo = [dataBlock: DataBlock]中指定ConfigPreset意味着您必须先指定ConfigPreset所有者,才能创建DataBlock实例。

    所以基本上下面的语句
    new ConfigPreset()将始终返回nullnew ConfigPreset(dataBlock: aDataBlock)将返回一个有效的ConfigPreset实例。
    addToXXX方法基本上在执行以下操作:

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


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

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

    或者,您可以删除belongsTo,然后new ConfigPreset()将起作用。

    关于grails - Grails中的合成:构造函数中的addTo *,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2788163/

    10-14 15:03