【问题标题】:Grails - fetchmode - what's it do?Grails - fetchmode - 它有什么作用?
【发布时间】:2010-01-06 19:35:30
【问题描述】:

在我的 Grails 域中,我有如下内容

class A {
    String name
    static hasMany = [ b : B ]
    SortedSet b
    static fetchMode = [ b:"eager" ]
}

class B implements Comparable{
    A a
    ... compareTo method defined ....
}

我要做的是检索 A 类的一个实例,同时填充它的集合 (b)。

所以我做 A.get(1),期望 b 被填充,

但是 b.each(){ 打印它 }

告诉我我在一个空对象上调用每个

我担心我从根本上错过了这里的重点,但我看不出我做错了什么。

我将其作为集成测试运行,针对 MySql 数据库。该数据库似乎填充了允许 A 和 B 之间关联的数据。

非常感谢任何帮助。

戴夫

【问题讨论】:

    标签: grails


    【解决方案1】:

    也许你需要

    static mapping = {
    b lazy:false }
    

    【讨论】:

    • 对不起,回答你原来的问题。 fetch 模式告诉 hibernate 在为数据库生成查询时执行连接或另一个选择。你可能会看到像“b fetch:'join'”这样的东西,它会告诉hibernate在获取所有b而不是另一个选择时使用连接“
    • 谢谢 Derek - 这证实了我的想法。我也尝试了您建议的解决方案,但仍然没有任何乐趣。这两种指定 fetchmode 的方法是等效的,还是一种取代了另一种?
    • 嗨,戴夫,我认为一个并没有取代另一个。有一点不同。如果您使用lazy:false,它将使用另一个SELECT 查询急切地获取。如果您使用 fetch:join 它会使用 JOIN 查询急切获取(您不需要lazy:false)。不知道为什么你没有得到任何数据。您是在测试前使用引导脚本还是手动使用 sql 填充数据库?
    • 更多信息 - 我在 Bootstrap.groovy 中设置数据,然后运行集成测试。我已经更改了数据源,现在它只使用已经存储在数据库中的数据,并且测试正在运行。所以看来我对 FetchMode 的理解还可以——我对 bootstrap.groovy 和集成测试之间的交互的理解是错误的。
    • 嗨,Derek - 为了完善这一点,bootstrap.groovy 运行用于集成测试,但您需要刷新会话以使更改对后续测试可见。此链接为我指明了正确的方向:old.nabble.com/…
    猜你喜欢
    • 2018-06-12
    • 2011-01-14
    • 1970-01-01
    • 2012-05-24
    • 2019-04-26
    • 2016-04-29
    • 2017-03-02
    • 2012-10-04
    • 1970-01-01
    相关资源
    最近更新 更多