0

我正在将 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(),但我希望有更好的方法来解决这个问题。

提前致谢!

4

2 回答 2

1

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

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

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

如果在从AuditQuery.

于 2020-01-17T20:32:03.917 回答
0

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

class Person {
   String name
   Date dateCreated
   Date lastUpdated
   def onLoad() {
      log.debug "Loading ${id}"
   }
}
于 2020-01-15T21:32:33.903 回答