我如何使用休眠Envers触发实体onLoad()?

问题描述 投票:0回答:2

我正在将Hibernate Envers添加到我的Grails 3项目中。我注意到对于我的一个具有onLoad()事件的实体,从来没有为Envers修订版实体调用onLoad()事件。

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

用例:

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

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

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

这对于正常的域实例来说很好用,但是当我从Envers的AuditQueryCreator查找实体修订时,审计查询没有调用onLoad()方法。

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

提前感谢!

hibernate grails gorm hibernate-envers grails-3.3
2个回答
1
投票

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

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

这里最重要的一点是,Envers Query API are n't

实体返回的对象。这些对象不是由持久性提供程序管理的,因此清楚区分这一点很重要,因为这会影响很多持久性行为的期望,例如分离的实体,实体生命周期事件等。

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.