在我的应用程序中,我有几个经过审核的实体类,例如以下内容。
它包含与具有各种 Hibernate 注释的其他实体的多个 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; ... }
我正在使用以下代码片段分析审计跟踪, 它返回审计表实体的所有属性值。
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; }
工作正常,但是这没有考虑到遍历类中的关系。
我可以以某种方式开发一种递归算法,它可以检测对象属性的类型,然后进行递归调用吗?
是否有更好的方法来完成此操作?
最佳答案
更简单的方法...
我假设对象树的保存发生在事务中。您可以修改审计表,为每笔交易添加一些唯一标识符。
这样您就可以将审核历史记录作为更改集的集合进行浏览 - 例如查看单个事务中所做的所有更改。
不完全是您所要求的,但会更容易实现并带来许多好处。您所要求的实现起来会非常复杂。
关于java - Hibernate Envers - 遍历关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3249925/