首页 > 解决方案 > Hibernate PostUpdateEvent getState 和 getOldState 值的顺序

问题描述

一点背景故事。我正在使用spring数据开发一个java项目,我需要以自动方式记录对所有实体所做的所有更改以及在mongodb中它是什么类型的更改(事件类型)(例如INSERT、UPDATE、DELETE) .

为此,我使用休眠 postEventListeners(PostInsertListener、PostUpdateListener 和 PostDeleteListener)。这一切都很好,但是现在对原始要求进行了更改,我需要创建更多的事件类型(例如 LOGIN )。要创建 LOGIN 事件,而不完全更改现有代码,我发现我可以进行简单检查,以查看我正在处理的实体是否是用户,以及唯一更改的属性是否是 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[] 中的属性的顺序是什么,或者我如何更改我的代码以使该值不被硬编码?有没有办法获得一对属性值,而不是只获得一个值数组?

标签: javahibernate

解决方案


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

我将在此处留下链接以感谢 Vlad Mihalcea 回答

要获取属性名称,请使用以下命令:

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

然后匹配数组索引,你就会知道哪些属性发生了变化。


推荐阅读