【问题标题】:Grails lazy fetch in bidirectional one-to-manyGrails 双向一对多延迟获取
【发布时间】:2014-10-13 22:21:39
【问题描述】:

我对双向一对多关系中的惰性初始化集合感到困惑,

我有两个域Module和Rule,它们之间有一个双向的otm

Class Module{
..
static hasMany = [providedRules : Rule]
..
}

Class Rule{
..
static belongsTo = [module : Module]
..
}

一个简单的测试方法:

def module = Module.get(id)
module.providedRules.each{
println it.description // i expected a query to Rule table for each iteration
}

我希望对“描述”属性的每次访问都有一个查询,但我没有看到任何迭代查询。

你有什么想法吗?

谢谢

【问题讨论】:

  • 所以,它不是。你又问了什么问题?
  • 但默认情况下,集合应该是惰性初始化的......
  • 它是,直到你明确加载它
  • 但我得到的是真实类的实例集合而不是代理集合。
  • 您可能会通过 groovy MP 即时获得增强的代理集合。你能描述你的问题,而不是你的观察或见解吗?

标签: grails one-to-many lazy-evaluation


【解决方案1】:

像这样添加日志并查看日志中发生的情况:

datasource {
...
logSql = true
...
}

另请参阅文档中的 fetching 更新: 在 grails 中检查。从 Rule 中删除 belongsTo ,它就像你想要的那样工作。 Lokks 就像双向映射一样,它加载的不是代理而是完整的对象。

【讨论】:

  • 我想你不明白... 延迟加载的集合是代理对象的集合,每个代理都有一个 ID 值,但其他字段仍然为 NULL,直到您显式访问它。
  • 如果您有一个单向的一对多:使用连接表,则由一个查询加载的集合是代理集合。如果要加载真实对象来替换每个代理,则需要对每个代理进行额外查询。
  • 如果你有一个双向的一对多,你可以使用“join”fetch来加载整个真实对象的集合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多