Grails GORM加载对象集合问题

时间:2011-07-08 13:42:40

标签: grails gorm

我正在尝试在名为Contributor的类中加载一个Evaluations列表,但我遗漏了一些内容,因为我无法通过测试。

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

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

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

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

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
    }
}

感谢。

2 个答案:

答案 0 :(得分:2)

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

第一个不起作用,因为Grails在您分配eval.contributor时未指定其他结束关联,即它不会调用contributor.addToEvals(eval)。我不明白为什么 - 必须有一些实施原因。

所以contributor在Hibernate缓存中保持相同的空evals。如果它从缓存中删除并重新读取它,它将填充evals,因为该关联仅映射在Eval表的外键上。

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

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

答案 1 :(得分:0)

啊,我已经怀疑了。问题是我保存对象的方式。

以下不起作用:

def contributor = new Contributor([name:'Homer']).save(failOnError:true)
def eval = new Evaluation([contributor:contributor, comment:'Must read article']).save(failOnError:true)

def contributor = new Contributor([name:'Homer']).save(failOnError:true)
def eval = new Evaluation([contributor:contributor, comment:'a comment']).save(failOnError:true)
contributor.evals = [eval]
contributor.save(failOnError:true)

或者,这确实有效:

def contributor = new Contributor([name:'Homer'])
def eval = new Evaluation([contributor:contributor, comment:'a comment'])
contributor.evals = [eval]
contributor.save(failOnError:true)

我不完全理解为什么选择数据时顶部保存方法不起作用,因为贡献者的ID保存在评估中。

相关问题