休眠PostUpdateEvent的getState和getOldState值顺序

时间:2018-07-11 10:46:44

标签: java hibernate

一些背景故事。我正在使用Spring数据在Java项目中工作,我需要以自动方式记录对mongodb中所有实体所做的所有更改及其更改类型(事件类型)(例如INSERT,UPDATE,DELETE)。 。

为此,我正在使用休眠的postEventListeners(PostInsertListener,PostUpdateListener和PostDeleteListener)。一切都很好,但是现在对原始要求进行了更改,我需要创建更多事件类型(例如LOGIN)。 为了创建LOGIN事件,而不完全更改现有代码,我发现我可以进行简单的检查,以查看我正在处理的实体是否为User,并且唯一更改的属性是lastLogin。

if (entity instanceof User) {
            if(updateEvent.getDirtyProperties().length == 1 && updateEvent.getDirtyProperties()[0] == 8)
                history.setEventType(HistoryEvent.LOGIN);
}

updateEvent是onPostUpdate函数的PostUpdateEvent的实例。

这很好,但是我当前的实现并不理想。在休眠状态下,getState()和getOldState()返回,而Object []包含要更新的对象的所有属性。 getDirtyProperties()返回一个索引数组,该索引仅包含在getState和getOldState数组中不同的属性的索引。

我遇到的问题是,由getState和getOldState返回的Object []仅包含属性的值,而我无法弄清楚它们的顺序。现在,我只是对索引进行了硬编码,但是此解决方案并不理想,因为如果我从User类添加/删除属性,索引也会被修改,并且我必须找出新索引是什么并进行更改。

我的问题是,Object []中的属性按什么顺序排列,或者我如何更改我的代码以使值不被硬编码?有没有办法获取一对属性值,而不是仅获取值数组?

1 个答案:

答案 0 :(得分:0)

所以我实际上在一个休眠的论坛上找到了答案。

我将留下链接,以表扬Vlad Mihalcea Answer here

  

要获取属性名称,请使用此:

String[] properties = event.getPersister().getPropertyNames();
     

然后匹配数组索引,您将知道具有什么属性   改变了。