java - Hibernate Envers - 遍历关系

标签 java hibernate hibernate-envers

在我的应用程序中,我有几个经过审核的实体类,例如以下内容。
它包含与具有各种 Hibernate 注释的其他实体的多个 HAS-IS 关系。

@Entity
@Audited
public class Entity implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    private Integer Id;

    @ManyToMany
    private Set < Country> affectedCountries;

    @OneToOne
    private Impact impact;

    @Enumerated(EnumType.STRING)
    private Owner owner;

    ...
}

我正在使用以下代码片段分析审计跟踪, 它返回审计表实体的所有属性值。

public List< AuditTrailForm> getAuditTrailEntries(Class< ?> clazz, Serializable id) {
        AuditReader reader = AuditReaderFactory.get(this.getSession());
        List < Number> revNumbers = reader.getRevisions(clazz, id);
        List< AuditTrailForm> forms = new ArrayList();
        Iterator< Number> it = revNumbers.iterator();

        while(it.hasNext()) {

            Number item = it.next();
            Object obj = reader.find(clazz, id, item);
            AuditInfo revision = reader.findRevision(AuditInfo.class, item);

            BeanMap beanMap = new BeanMap(obj);
            HashMap map = new HashMap();

            Set keys = beanMap.keySet( );
            Iterator keyIterator = keys.iterator( );

            while( keyIterator.hasNext( ) ) {
               String propertyName = (String) keyIterator.next( );

                if (beanMap.getType(propertyName).equals(String.class)) {
                   String propertyValue = (String) beanMap.get( propertyName );
                      map.put(propertyName, propertyValue);  
                }
            }   
            Date createdAt = revision.getTimestamp();
            String user = revision.getUser();

            AuditTrailForm form = new AuditTrailForm(user, createdAt, map);
            forms.add(form);
        }
        return forms;
}

工作正常,但是这没有考虑到遍历类中的关系。
我可以以某种方式开发一种递归算法,它可以检测对象属性的类型,然后进行递归调用吗?
是否有更好的方法来完成此操作?

最佳答案

更简单的方法...

我假设对象树的保存发生在事务中。您可以修改审计表,为每笔交易添加一些唯一标识符。

这样您就可以将审核历史记录作为更改集的集合进行浏览 - 例如查看单个事务中所做的所有更改。

不完全是您所要求的,但会更容易实现并带来许多好处。您所要求的实现起来会非常复杂。

关于java - Hibernate Envers - 遍历关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3249925/

相关文章:

java - 恢复(取消)对 SpringData 存储库实体的更改

java - Hibernate Envers - 在 ValidityAuditStrategy 中支持 JDBC 批处理(allow_identifier_reuse=true)

hibernate - 如何使用 hibernate Envers触发实体onLoad()?

java - 计算用户定义的年数中四个季度的降雨量

扩展/解析为许多注释的 Java 注释?

java - GWT 事件 : what am i missing?

java - Hibernate 枚举转换和转换器映射

java - 映射 @Entity 时出现 UnsatisfiedDependencyException beancreationerror

CDI Bean 和 Hibernate Envers

java - 无法运行 ant build.xml