在我的应用程序中,我有几个经过审计的实体类,例如以下内容 .
它包含与具有各种休眠注释的其他实体的多个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 回答
一种更简单的方法......
我假设对象树的保存发生在事务中 . 您可以修改审计表,以便为每个事务添加一些唯一标识符 .
这样,您就可以将审核历史记录作为变更集的集合进行浏览 - 例如查看单个事务中所做的所有更改 .
不是你要求的,但是要容易实现并提供许多好处 . 您要求的内容实施起来非常复杂 .