Envers 4.2.x 为 AUD 添加一条记录 table 即使没有变化

Envers 4.2.x adds a record to the AUD table even if there are no changes

我正在使用 Hibernate Envers 4.2。21.FINAL。因为我只想跟踪一些属性的变化,所以我添加了注释

@Audited(withModifiedFlag = true)

在他们身上。标志列 "propname_MOD" 已正确创建,但问题是当我保存对象时,所有 MOD 标志都设置为 true,而不仅仅是我修改的属性。 有谁知道如何解决这个问题?

更新 我注意到在 class org.hibernate.envers.event.EnversPostUpdateEventListenerImpl 中, 当以下对象被实例化时

AuditWorkUnit workUnit = new ModWorkUnit(
    event.getSession(),event.getPersister().getEntityName(),getAuditConfiguration(),
    event.getId(),event.getPersister(),newDbState,event.getOldState() );

event.getOldState() 为空,但 IMO 不应为空。这就是 Envers 每次都添加新版本的原因。

问题实际上与 event.getOldState() 相关 null

这是由于 Hibernate 的 saveOrUpdate 方法造成的,它认为来自 JSF 的实体是分离的。 我现在使用 merge 而不是 saveOrUpdate 并且 Envers 正确地将 _MOD 字段存储为 true 或 false。