gpt4 book ai didi

java - hibernate 恩弗斯 : How to check if a field has changed between two revisions?

转载 作者:行者123 更新时间:2023-12-01 06:10:07 25 4
gpt4 key购买 nike

我正在使用 Hibernate envers 来审核应用程序中的实体。我为每个实体都有单独的 _audit 表,然后在这些表中我有 _mod boolean 列来指示该字段是否已更改。

但是,我不知道如何在查询中使用该列,甚至不知道如何在代码中获取这些数据?

例如以下代码给出了受审计人员的列表。如何检查哪些数据已更改?

List person = getAuditReader().createQuery()
.forEntitiesAtRevision(Person.class, 12)
.getResultList();

最佳答案

您可以循环遍历给定实体的所有字段并查明该字段是否已更改。

循环遍历修订号 12 的 Person 实体的所有字段并查找已更新字段的值的示例代码片段。

  public void processFields() throws Exception {
for (Field field : Person.class.getDeclaredFields()) {
final Person changedEntity = fetchEntityForRevisionWhenPropertyChanged(Person.class, 12, field.getName());
if (changedEntity != null) {
// Updated field value for the field. This will list all fields which are changed in given revision.
final Object fieldValue = getField(changedEntity, field.getName());
}
}
}

private <T> Object getField(final T object, final String fieldName) throws Exception {
return new PropertyDescriptor(fieldName, object.getClass()).getReadMethod().invoke(object);
}

private <T> T fetchEntityForRevisionWhenPropertyChanged(final Class<T> entityClass, final int revisionNumber, final String propertyName) {
final List<T> resultList = getAuditReader()
.createQuery()
.forEntitiesModifiedAtRevision(entityClass, revisionNumber)
.add(AuditEntity.property(propertyName).hasChanged())
.addOrder(AuditEntity.id().asc())
.getResultList();

if (CollectionUtils.isNotEmpty(resultList)) {
return resultList.get(0);
} else {
return null;
}
}

在任何情况下,如果您想查找实体的先前修订版本以进行比较,您可以使用以下方法:

  public T getPreviousVersion(final Class<T> entityClass, final Long entityId, final Long currentRevisionNumber) {
final AuditReader reader = AuditReaderFactory.get(entityManager);

final Number previousRevision = (Number) reader.createQuery()
.forRevisionsOfEntity(entityClass, false, true)
.addProjection(AuditEntity.revisionNumber().max())
.add(AuditEntity.id().eq(entityId))
.add(AuditEntity.revisionNumber().lt(currentRevisionNumber))
.getSingleResult();

return Optional.ofNullable(previousRevision)
.map(previousRev -> reader.find(entityClass, entityId, previousRev))
.orElse(null);
}

关于java - hibernate 恩弗斯 : How to check if a field has changed between two revisions?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36277333/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com