首页 文章

Hibernate Envers - 遍历关系

提问于
浏览
1

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

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

1 回答

  • 2

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

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

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

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

相关问题