Hibernate Envers - 遍历关系

时间:2010-07-14 19:53:44

标签: java hibernate hibernate-envers

在我的申请中,我有几个经审计的实体类,例如以下内容 它包含与具有各种休眠注释的其他实体的多个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;

    ...
}

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

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;
}

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

1 个答案:

答案 0 :(得分:2)

一种更简单的方法......

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

通过这种方式,您可以将审核历史记录浏览为变更集的集合 - 例如查看单笔交易中所做的所有更改。

不是你要求的,但是要容易实现并提供许多好处。您要求的内容实施起来非常复杂。