在我的申请中,我有几个经审计的实体类,例如以下内容
它包含与具有各种休眠注释的其他实体的多个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; }
工作正常,但这并没有考虑到遍历班级中的关系。我可以以某种方式开发一种递归算法,它会检测对象属性的类型然后进行递归调用吗?是否有更好的方法可以完成此操作?
答案 0 :(得分:2)
一种更简单的方法......
我假设对象树的保存发生在事务中。您可以修改审计表,以便为每个事务添加一些唯一标识符。
通过这种方式,您可以将审核历史记录浏览为变更集的集合 - 例如查看单笔交易中所做的所有更改。
不是你要求的,但是要容易实现并提供许多好处。您要求的内容实施起来非常复杂。