【问题标题】:Return Hibernate envers Audit revision with modified flags返回带有修改标志的 Hibernate envers 审计修订
【发布时间】:2015-09-20 05:16:01
【问题描述】:

我在我的应用程序中使用 Hibernate Envers 来跟踪我的实体的所有字段的变化。 我正在使用 @Audited(withModifiedFlag=true) 注释来做到这一点。

记录已正确记录在数据库中,_mod 字段正确指示更改的字段。

我想从某个实体获取特定的修订版本以及哪些字段已更改的信息。我正在使用以下方法来做到这一点:

        List<Object[]> results = reader.createQuery()  
            .forRevisionsOfEntity(this.getDao().getClazz(), false, true)  
            .add(AuditEntity.id().eq(id))  
            .getResultList(); 

此方法返回一个对象数组列表,其中我的实体作为第一个元素。

问题是返回的实体没有关于更改字段的任何信息。 那么,我的问题是:如何获取有关更改字段的信息?

【问题讨论】:

标签: java audit hibernate-envers


【解决方案1】:

我知道这个问题现在有点老了,但我试图这样做并没有真正找到任何答案。

似乎没有一个不错的方法来实现这一点,但这是我的做法。

首先,您需要使用投影,它不再为您提供已经为您映射好的实体模型。您仍然会得到一个 Objects 数组,但数组中的每个对象都对应于您添加的每个投影(按顺序)。

final List<Object[]> resultList = reader.createQuery()  
        .forRevisionsOfEntity(this.getDao().getClazz(), false, true)
        // if you want revision properties like revision number/type etc
        .addProjection(AuditEntity.revisionNumber())
        // for your normal entity properties
        .addProjection(AuditEntity.id())
        .addProjection(AuditEntity.property("title")) // for each of your entity's properties
        // for the modification properties
        .addProjection(new AuditProperty<Object>(new ModifiedFlagPropertyName(new EntityPropertyName("title"))))
        .add(AuditEntity.id().eq(id))
        .getResultList();

然后您需要手动映射每个结果。这部分由您决定,但我使用单独的类作为修订模型,因为它包含正常实体数据的额外数据。不过,如果您愿意,您可以使用实体类上的 @Transient 属性来实现这一点。

final List<MyEntityRevision> results = resultList.stream().map(this::transformRevisionResult)
            .collect(Collectors.toList());


private MyEntityRevision transformRevisionResult(Object[] revisionObjects) {
    final MyEntityRevision rev = new MyEntityRevision();
    rev.setRevisionNumber((Integer) revisionObjects[0]);
    rev.setId((Long) revisionObjects[1]);
    rev.setTitle((String) revisionObjects[2]);
    rev.setTitleModified((Boolean) revisionObjects[3]);
    return rev;
}

【讨论】:

    猜你喜欢
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    相关资源
    最近更新 更多