1

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

@实体
@已审核
公共类实体实现可序列化{

    私有静态最终长序列版本UID = 1L;

    @ID
    私有整数 ID;

    @ManyToMany
    私人设置 <Country> 受影响的国家;

    @OneToOne
    私人影响力;

    @Enumerated(EnumType.STRING)
    私有所​​有者所有者;

    ...
}

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

公共列表< AuditTrailForm> getAuditTrailEntries(Class< ?> clazz, Serializable id) {
        AuditReader 阅读器 = AuditReaderFactory.get(this.getSession());
        列表 <编号> revNumbers = reader.getRevisions(clazz, id);
        List< AuditTrailForm> forms = new ArrayList();
        迭代器<数字> it = revNumbers.iterator();

        而(it.hasNext()){

            编号项 = it.next();
            对象 obj = reader.find(clazz, id, item);
            AuditInfo 修订 = reader.findRevision(AuditInfo.class, item);

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

            设置键 = beanMap.keySet();
            迭代器 keyIterator = keys.iterator( );

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

                if (beanMap.getType(propertyName).equals(String.class)) {
                   String propertyValue = (String) beanMap.get( propertyName );
                      map.put(propertyName, propertyValue);  
                }
            }   
            创建日期At = revision.getTimestamp();
            字符串用户 = 修订.getUser();

            AuditTrailForm form = new AuditTrailForm(user, createdAt, map);
            forms.add(form);
        }
        退货表格;
}

工作正常,但这并没有考虑到遍历类中的关系。
我能否以某种方式开发一种递归算法,该算法将检测对象属性的类型,然后进行递归调用?
有没有更好的方法可以完全做到这一点?

4

1 回答 1

2

更简单的方法...

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

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

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

于 2010-07-28T21:42:25.607 回答