0

我已经实现了 Hibernate Envers的解决方案。

我通过创建自己的类来存储系统用户名来扩展 RevisionLister:

    import org.hibernate.envers.RevisionListener;

    public class CustomRevisionListener implements RevisionListener {

        public void newRevision(Object revisionEntity) {
            CustomRevisionEntity revision = (CustomRevisionEntity) revisionEntity;
            revision.setUsername(System.getProperty("user.name")); // for testing

        }

    }

这可以完成工作,但我想做的是制作更全面的记录,其中包括被审计的表名。

有谁知道我怎么能做到这一点。我找不到任何与记录表名有关的文档?

4

3 回答 3

3

请参阅envers 文档中的示例 15.2如何获取修改后的实体类。然后稍微更改代码以从实体类中获取表名(假设您在实体类上使用 JPA/Hibernate 注释):

public class CustomEntityTrackingRevisionListener
             implements EntityTrackingRevisionListener {
    @Override
    public void entityChanged(Class entityClass, String entityName,
                              Serializable entityId, RevisionType revisionType,
                              Object revisionEntity) {
        // either javax.persistence.Table or org.hibernate.annotations.Table
        Table tableAnnotation = entityClass.getAnnotation(Table.class);
        if (tableAnnotation != null)
          String tableName = tableAnnotation.getName();
          ((CustomTrackingRevisionEntity)revisionEntity).addTable(tableName);
        }
    }
于 2013-01-04T19:25:24.860 回答
1

我不知道 Envers 是否可以跟踪开箱即用的被审计记录的表名,但我知道它可以跟踪实体名称,而这可以通过三种不同的方式启用

于 2013-01-04T17:45:25.163 回答
0

您可以将DefaultTrackingModifiedEntitiesRevisionEntityorg.hibernate.envers.track_entities_changed_in_revision 参数扩展或配置为 true。

请参阅 Envers Doc:跟踪修订期间修改的实体名称

于 2014-11-20T05:51:57.803 回答