一些背景故事。我正在使用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 []中的属性按什么顺序排列,或者我如何更改我的代码以使值不被硬编码?有没有办法获取一对属性值,而不是仅获取值数组?
答案 0 :(得分:0)
所以我实际上在一个休眠的论坛上找到了答案。
我将留下链接,以表扬Vlad Mihalcea Answer here
要获取属性名称,请使用此:
String[] properties = event.getPersister().getPropertyNames();
然后匹配数组索引,您将知道具有什么属性 改变了。