一点背景故事。我正在使用 spring data 开发一个 java 项目,我需要以自动化的方式记录对所有实体所做的所有更改以及它是什么类型的更改(事件类型)(例如 INSERT、UPDATE、DELETE)。 。
为此,我使用 hibernate postEventListeners (PostInsertListener、PostUpdateListener 和 PostDeleteListener)。这一切都很好,但现在对原始要求进行了更改,我需要创建更多的事件类型(例如 LOGIN )。要创建 LOGIN 事件,而不完全更改现有代码,我发现我可以进行简单的检查,看看我正在处理的实体是否是用户,以及唯一更改的属性是否是lastLogin。
if (entity instanceof User) {
if(updateEvent.getDirtyProperties().length == 1 && updateEvent.getDirtyProperties()[0] == 8)
history.setEventType(HistoryEvent.LOGIN);
}
Run Code Online (Sandbox Code Playgroud)
updateEvent 是来自 onPostUpdate 函数的 PostUpdateEvent 的实例。
这工作正常,但我目前的实现并不理想。在 hibernate 中,getState() 和 getOldState() 返回包含正在更新的对象的所有属性的 Object[]。getDirtyProperties() 返回一个索引数组,仅包含 getState 和 getOldState 数组中不相同的属性的索引。
我遇到的问题是 getState 和 getOldState 返回的 Object[] 仅包含属性的值,并且我无法弄清楚它们的顺序。现在我只是硬编码了索引,但这个解决方案是不理想,因为如果我从 User 类中添加/删除属性,索引也会被修改,我必须找出新索引是什么并更改它。
我的问题是,Object[] 中的属性的顺序是什么,或者我如何更改我的代码以便该值不被硬编码?有没有办法获取一对属性值而不是仅获取值数组?
所以我实际上在休眠论坛上找到了答案。
\n\n我将留下链接以注明 Vlad Mihalcea \n在此回答
\n\n\n\n要获取属性名称,请使用以下命令:
\n\nRun Code Online (Sandbox Code Playgroud)\n\nString[] properties = event.getPersister().getPropertyNames();\n然后匹配数组索引,您\xe2\x80\x99就会知道什么属性已更改。
\n
| 归档时间: |
|
| 查看次数: |
1765 次 |
| 最近记录: |