【问题标题】:How do I trigger entity onLoad() using hibernate Envers?如何使用休眠 Envers 触发实体 onLoad()?
【发布时间】:2020-01-13 20:59:06
【问题描述】:

我正在将 Hibernate Envers 添加到我的 Grails 3 项目中。我注意到对于我的一个实体,它有一个onLoad() 事件,onLoad() 事件永远不会为 Envers 修订实体调用。

如何确保始终调用此代码,即使对于此实体的历史修订也是如此?

用例:

我正在使用 Grails 3 JSON 视图开发 RESTful 服务。我的一个域类有一个鉴别器列,它也必须在 JSON 输出中呈现,以便消费者知道它是什么类型。出于这个原因,域实体定义了一个onLoad() 方法,该方法填充了一个与鉴别器类型匹配的瞬态属性:

class MyChildDomainClass extends MyBaseDomainClass {
    void onLoad() {
        valueType = ValueType.STRING
    }

    static mapping = {
        discriminator value: ValueType.STRING
    }
}

这适用于普通域实例,但是当我从 Envers 的 AuditQueryCreator 查找实体修订时,审计查询没有调用 onLoad() 方法。

似乎我可以遍历结果并手动调用onLoad(),但我希望有更好的方法来解决这个问题。

提前致谢!

【问题讨论】:

    标签: hibernate grails grails-orm hibernate-envers grails-3.3


    【解决方案1】:

    如何确保始终调用此代码,即使对于此实体的历史修订也是如此?

    我不太熟悉 Grails,但这些看起来非常像典型的 JPA 事件生命周期注释事件,并且这些可能是 GORM(很像 JPA 实现者)根据实体的生命周期查找和调用的方法。

    这里最重要的一点是 Envers 查询 API 返回的对象不是实体。这些对象不由持久性提供者管理,因此明确区分很重要,因为这会影响许多持久性行为预期,例如分离实体、实体生命周期事件等。

    如果在从 AuditQuery 获取结果时需要触发一些初始化后或其他生命周期回调,则它会在用户代码上进行区分并根据需要调用这些方法。

    【讨论】:

    • 感谢您的回复。 Envers 是否有任何类型的生命周期挂钩?我在文档中找不到它
    • 不,目前没有,但这并不意味着如果真的有这样的需要,我们就不能考虑添加类似的东西。
    【解决方案2】:

    您可以尝试将返回类型更改为“def”,如文档 here 中所述

    class Person {
       String name
       Date dateCreated
       Date lastUpdated
       def onLoad() {
          log.debug "Loading ${id}"
       }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-12-20
      • 1970-01-01
      • 2017-06-08
      • 2017-12-13
      • 1970-01-01
      • 2017-04-11
      • 2011-04-30
      • 2015-10-31
      • 2019-06-22
      相关资源
      最近更新 更多