我正在尝试在名为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/