【问题标题】:How to get to the parent entity from child entity in grails with hibernate如何使用休眠从grails中的子实体获取父实体
【发布时间】:2013-03-29 18:59:50
【问题描述】:

我有以下问题。在 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)
}

一个Shop有很多不同类型的类别,例如DiaryHousehold等。每个类别可以有多个项目,例如MilkCheese等。

它们都是单向关系。

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

但是,我想将更改关联回Shop 级别,以便进行一些有意义的审计跟踪。如果我只更改特定商品的价格,我将在商品级别使用休眠中的 postupdateevent 来获取实体。有没有办法递归地回到Shop 级别,这样我就可以生成像(shopId).category(categoryId).price 这样的审计跟踪?这样,我会知道,对于价格的特定变化,它是针对哪个Category 和针对哪个Shop

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

【问题讨论】:

    标签: hibernate grails


    【解决方案1】:

    如果您没有双向链接,那么您将不得不“从顶部搜索”,可能使用标准

    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") 这样的简单查询最终可能会将您的整个数据库加载到内存中......
    猜你喜欢
    • 2013-07-24
    • 1970-01-01
    • 2017-08-28
    • 1970-01-01
    • 2012-03-12
    • 1970-01-01
    • 1970-01-01
    • 2017-10-23
    • 2017-09-27
    相关资源
    最近更新 更多