我正在尝试在名为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
}
}
感谢。
答案 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保存在评估中。