渴望在grails中获取整个对象树

时间:2012-08-26 22:43:16

标签: hibernate grails gorm

所以我在域中有一些对象,它们之间具有hasMany关系,如下所示

Class Car {
    String name
    SortedSet tires = [] as SortedSet
    static hasMany = [tires: Tire]
}

Class Tire {
    String type
    SortedSet screws = [] as SortedSet
    static hasMany = [screws: Screw]
}

Class Screws {
     String type
}

现在我想让整个对象树脱机,以获得我可以通过findByName获得的某种汽车。我知道我们可以对取景器进行抢夺,但这只会降低一个级别。在示例中,我有2个级别或更多。

所以我的问题是这个。是否有一个优雅的解决方案,渴望获取整个对象树,然后使用它没有grails / Hibernate触发另一个查询来获取详细信息。

我尝试了以下似乎有类似结果但很难优雅的。

withCriteria解决方案

def cars = Car.withCriteria {
    tires {
        screws {
            join 'screws'
        }
    }

此外,我尝试将整个树转换为JSON并重新分析它,但这似乎是一种矫枉过正。我想基本上我试图让整个对象树脱机。如果可以轻松完成或根本没有想到这些想法吗?

TIA

1 个答案:

答案 0 :(得分:3)

使用映射闭包:

Class Car {
    String name
    SortedSet tires = [] as SortedSet
    static hasMany = [tires: Tire]
    static mapping = {
        tires lazy: false
    }
}

Class Tire {
    String type
    SortedSet screws = [] as SortedSet
    static hasMany = [screws: Screw]
    static mapping = {
        screws lazy: false
    }
}

Class Screws {
     String type
}

也许您应该像规则一样处理异常,我的意思是,您可以将您的域类配置为lazy: false并使用fetch lazy调用您的finder:

def cars = Car.findAllByType(type: "Alfa", [fetch: [tires: 'lazy']])

我不知道这是否是一个有效选项,但你可以试试。