java - 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[] 中的属性的顺序是什么,或者我如何更改我的代码以使该值不被硬编码?有没有办法获得一对属性值,而不是只获得一个值数组?
解决方案
所以我实际上在休眠论坛上找到了答案。
我将在此处留下链接以感谢 Vlad Mihalcea 回答
要获取属性名称,请使用以下命令:
String[] properties = event.getPersister().getPropertyNames();
然后匹配数组索引,你就会知道哪些属性发生了变化。
推荐阅读
- angular - 模拟类属性时,Jasmine 不显示模板内容
- python - 在 Pytorch 上使用多个 GPU
- c++ - 如何以编程方式在 C++ 中创建多个结构
- javascript - React + JavaScript:项目出现在控制台上但随后消失
- python - 每 N 秒使用 DataFrame 自动刷新 div
- css - 通过css旋转图像,图像保持垂直空间
- machine-learning - 计算机可以通过分析别人的游戏来学习游戏的策略吗?
- sql-server - 当有更多字段时,SQL Server 索引扫描?
- sql - 使用 ID 连接两个 SQL 表,其中 ID 是文本
- recursion - 编写一个递归函数,用伪代码总结值的数量,奇数二进制数为 1