2013-03-29 53 views
0

我有以下問題。 Grails中,讓我們說,我有以下關係:如何去從子實體中的Grails父實體與Hibernate

class Shop { 
    static hasMany = [category: Category] 
    String name; 
    .... (additional shop attributes) 
} 

class Category { 
    static belongsTo = [Shop] 
    static hasMany = [item: Item] 
    String name; 
    ... (additional category attributes) 
} 

class Item { 
    static belongsTo = [Category] 
    String name; 
    double price; 
    ... (additional item attributes) 
} 

一個Shop有許多不同類型的類別,如DiaryHousehold等每個類別可以有多個項目,如MilkCheese等。

他們都是單向的關係。

我使用Hibernate事件偵聽器捕捉到的變化發生後,插入/更新/刪除。如果我只對每個級別發生的事情感興趣,那就太好了。例如,如果一個商品的價格從休眠事件發生變化,我可以進入商品實體,並且我會知道價格字段隨着商品ID xxx而改變。

不過,我想這樣我就可以做一些有意義的審計跟蹤的更改回Shop水平相關聯。如果我只爲某個特定項目進行價格更改,那麼在休眠狀態下,我將通過postupdate事件來獲取項目級別的實體。有沒有辦法遞歸地回溯到Shop的水平,所以我可以生成一個審計跟蹤,如(shopId).category(categoryId).price?這樣,我就會知道,對於某個價格的某個特定變化,它是爲哪個Category而哪個爲Shop

是否大盤元類或Hibernate工具類提供了這樣的方法,從最底層的孩子遍歷對象樹最頂級的家長嗎?

回答

1

如果你不具備雙向鏈接,那麼你就必須「從上搜索」,可能使用標準

def shops = Shop.withCriteria { 
    category { 
    item { 
     idEq(currentItem.id) 
    } 
    } 
} 

這會給你所有具有類別的商店的列表包含currentItem

+0

如果你有雙向鏈接('靜態屬於關聯= [類別:類別]','靜態屬於關聯= [店:店鋪]'),你可以使用'item.category.shop'一個項目得到你的店。包含這些鏈接是否有缺點? –

+0

@BobMcCracken它應該是安全的,但如果你有很多雙向關聯,你需要小心急於加載和延遲加載。如果你不小心,像Item.findByName(「foo」)這樣的簡單查詢最終會將你的整個數據庫加載到內存中...... –

相關問題