grails - Grails中的合成:构造函数中的addTo *

标签 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实例为空?如果我尝试在例如创建一个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/

    相关文章:

    hibernate - withCriteria “or”就像其他表格的属性一样

    grails - Spring Boot-java.lang.ClassNotFoundException:javax.servlet.ServletContext并且无法启动EmbeddedWebApplicationContext

    pointers - 初始化嵌入结构时的指针差异

    modeling - 价格数据建模

    java - 我们可以用什么来快速显示和更新大量的简单对象呢?

    database-design - 当人们有多个工作时,使用人员,职位和团队为组织建模的最佳方法是什么?

    java - 将 Grails 部署到 AWS 错误 404

    grails - 如何访问 Grails 2.0 中的 Grails 配置?

    c++ - 类链中的转换

    javascript - 组合对象时如何避免名称冲突