在我的应用程序中,我有几个审核的实体类,例如以下。
它包含具有各种休眠注释的与其他实体的多个HAS-IS关系。
@实体
@审核
公共类Entity实现Serializable {
私有静态最终长serialVersionUID = 1L;
@ID
私人整数ID;
@多多多
私有集受影响的国家;
@OneToOne
私人影响
@Enumerated(EnumType.STRING)
私人业主;
...
}
我正在使用以下代码片段分析审计线索,
从审核表实体返回所有属性值。
public List getAuditTrailEntries(Class clazz,可序列化的ID){
AuditReader reader = AuditReaderFactory.get(this.getSession());
列表 revNumbers = reader.getRevisions(clazz,id);
List 表单= new ArrayList();
Iterator it = revNumbers.iterator();
while(it.hasNext()){
编号项目= it.next();
对象obj = reader.find(clazz,id,item);
AuditInfo版本= reader.findRevision(AuditInfo.class,item);
BeanMap beanMap =新BeanMap(obj);
HashMap map = new HashMap();
设置键= beanMap.keySet();
迭代器keyIterator = keys.iterator();
while(keyIterator.hasNext()){
字符串propertyName =(String)keyIterator.next();
如果(beanMap.getType(propertyName).equals(String.class)){
字符串propertyValue =(String)beanMap.get(propertyName);
map.put(propertyName,propertyValue);
}
}
创建日期= =版本.getTimestamp();
字符串用户= version.getUser();
AuditTrailForm表单=新的AuditTrailForm(用户,createdAt,地图);
form.add(form);
}
退货表格;
}
效果很好,但是这并未考虑遍历类中的关系。我能以某种方式开发一种递归算法,该算法将检测对象属性的类型,然后进行递归调用吗?也许有更好的方法可以完全做到这一点?
最佳答案
一种更简单的方法...
我假设保存到对象树发生在事务中。您可以修改审核表以为每个事务添加一些唯一的标识符。
这样,您就可以将审核历史记录作为一组变更集进行浏览-例如查看单个交易中进行的所有更改。
不太符合您的要求,但是更容易实现并带来很多好处。您要实现的内容将非常复杂。