grails - Grails GORM加载对象集合问题

标签 grails gorm

我正在尝试在名为Contributor的类中加载评估列表,但由于无法通过测试而错过了一些东西。

我的测试是按预期方式创建和保存对象,因为当我执行Evaluations.list()和Contributor.list()并打印值时,我看到了保存的数据。

此外,当我选择评估并打印其“贡献者”属性的值时,它似乎是正确的。

但是,当我选择一个贡献者并打印其“评估”属性的值时,它为null。

我以为我的映射是问题吗?

class Contributor {
    String name

    static hasMany = [evals:Evaluation]

    static mapping = {
        id column: 'user_id'
        evals joinTable:[name:'evaluation', column:'eval_id', key:'eval_user_id']
        version false
    }
}

class Evaluation {
    Contributor contributor
    String comment

    static mapping = {
        id column:'eval_id'
        contributor column:'eval_user_id'
        version false
    }
}

谢谢。

最佳答案

您不应该像evals这样分配contributor.evals = [eval]。而是调用动态方法addTo*():contributor.addToEvals(eval)。这将为evals创建一个Hibernate集合,该集合将在以后保留。

第一个不起作用,因为在分配eval.contributor时Grails不会分配关联的另一端,即它不调用contributor.addToEvals(eval)。我不知道为什么-必须有一些实施原因。

因此contributor在Hibernate缓存中保留了相同的空evals。如果它不在高速缓存中,并且您重新读取它,它将填充evals,因为该关联仅映射在Eval表的外键上。

空的evals为空-这是另一个Hibernate功能:当集合为空时,它可以为空。知道吧

这是一篇很好的简短文章,解释了一些Hibernate内部原理:http://blog.xebia.com/2008/03/advanced-hibernate-proxy-pitfalls/

关于grails - Grails GORM加载对象集合问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6625304/

相关文章:

hibernate - 使用LazyList时,Grails一对多关系无法创建回到父级的链接

grails - Grails 3.2-对象版本不会更新

grails - 在Grails中使用SpringSecurity插件进行鉴别器 Multi-Tenancy 设置

Grails - 如何从 WAR 中删除 log4j

amazon-web-services - 如何使用Java SDK获取AWS Quicksight仪表板的嵌入URL

grails - 从groovy堆栈跟踪中获取源代码信息

grails - 将SQL查询转换为GORM条件

debugging - 针对 Grails 运行时环境交互式运行代码

Grails 资源订单

grails - 如何限制grails中的关联大小?