2012-08-26 25 views
4

所以我必須在域中處於相互如下渴望獲取Grails的整個對象樹

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 
} 

一個的hasMany關係的幾個對象,現在,我想借此對整個對象樹離線我可以通過findByName獲得某種汽車。我知道我們可以對取景器做一個渴望,但那只是一個級別。正如在例子中我有2個或更多的水平。

所以我的問題是這樣的。有沒有一個優雅的解決方案,急於獲取整個對象樹,然後在沒有grails/Hibernate的情況下使用它來觸發另一個查詢來獲取細節。

我嘗試了以下似乎有相似的結果,但幾乎沒有優雅。

的withCriteria解決方案

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

我也試過整個樹轉換成JSON和重新分析,但是,這似乎是矯枉過正。我想基本上我試圖讓整個對象樹離線。任何想法,如果這可以輕鬆完成或完成?

TIA

回答

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,並打電話給你的取景器取得懶惰:

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

我不知道這是否是一個有效的選項,但你可以嘗試它。

+1

這絕對是一個選項,除非我希望這隻發生在特殊情況下,而不是所有其他呼叫的常規行爲。這就是爲什麼我要避免更新域名。 – bythe4mile

+0

我想你可以嘗試用hql獲取,但與withCriteria解決方案相比,它幾乎不會更優雅。請記住,您可以將您的實際解決方案以靜態方法封裝到域類中,然後創建單元測試並重新提煉。 –

+0

我想。如果在grails中有一種方法可以將對象從字面上脫機,那本來就不錯。我也嘗試克隆它,但是當你進入樹中時它變得太複雜了。 – bythe4mile