Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用hibernate从grails中的子实体访问父实体_Hibernate_Grails - Fatal编程技术网

如何使用hibernate从grails中的子实体访问父实体

如何使用hibernate从grails中的子实体访问父实体,hibernate,grails,Hibernate,Grails,我有以下问题。在grails中,假设我有以下关系: class Shop { static hasMany = [category: Category] String name; .... (additional shop attributes) } class Category { static belongsTo = [Shop] static hasMany = [item: Item] String name; ... (addi

我有以下问题。在grails中,假设我有以下关系:

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)
}
商店
有许多不同类型的类别,如
日记
家庭
等。每个类别可以有多个项目,如
牛奶
奶酪

它们都是单向关系

我正在使用hibernate事件侦听器捕获插入/更新/删除后发生的更改。如果我只对每一级发生的事情感兴趣,那就太好了。例如,如果一个项目的价格发生了变化,从hibernate事件,我可以访问项目实体,我将知道价格字段随着项目id xxx发生了变化

但是,我想将更改关联回
Shop
级别,以便进行一些有意义的审计跟踪。如果我只对特定项目进行价格更改,我将在hibernate中通过postupdateevent在项目级别获得实体的控制。是否有一种方法可以递归遍历回
商店
级别,以便生成类似
(shopId).category(categoryId).price的审计跟踪?这样,我就知道,对于价格的特定变化,是针对哪个
类别
和哪个
商店


grail元类或hibernate实用程序类是否提供了从最底层的子对象到最顶层的父对象的遍历方法?

如果没有双向链接,则必须“从顶部搜索”,可能需要使用条件

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

这将为您提供一个包含
currentItem

类别的所有商店的列表,如果您确实有双向链接(
static belongsTo=[category:category]
static belongsTo=[shop:shop]
),您可以使用
item.category.shop
从一个项目中获取您的商店。包含这些链接有缺点吗?@BobMcCracken应该是安全的,但是如果你有很多双向关联,那么你需要小心急加载和延迟加载。如果您不小心,像
Item.findByName(“foo”)
这样的简单查询可能会将整个数据库加载到内存中。。。