我正在将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()
,但我希望有更好的方法来解决此问题。
提前感谢!
即使该实体的历史修订版,也如何确保始终调用此代码?
我不太熟悉Grails,但是它们看起来很像典型的JPA事件生命周期注释事件,而这些很可能是GORM(非常类似于JPA实现者)根据实体生命周期寻找和调用的方法。 >
这里最重要的一点是,Envers Query API are n't
实体返回的对象。这些对象不是由持久性提供程序管理的,因此清楚区分这一点很重要,因为这会影响很多持久性行为的期望,例如分离的实体,实体生命周期事件等。如果从AuditQuery
获取结果时需要触发一些初始化后的生命周期或其他生命周期回调,则在用户代码上进行区分并根据需要调用这些方法。
您可以尝试将返回类型更改为“ def”,如文档here中所述