【问题标题】:Hibernate Envers - traversing the relationsHibernate Envers - 遍历关系
【发布时间】:2011-03-16 01:30:25
【问题描述】:

在我的应用程序中,我有几个经过审计的实体类,例如以下。
它包含与具有各种休眠注释的其他实体的多个 HAS-IS 关系。

@实体 @已审核 公共类实体实现可序列化{ 私有静态最终长序列版本UID = 1L; @ID 私有整数 ID; @ManyToMany 私人设置 &lt Country&gt 受影响的国家; @OneToOne 私人影响力; @Enumerated(EnumType.STRING) 私有所​​有者所有者; ... }

我正在使用以下代码片段分析审计跟踪, 它返回审计表实体的所有属性值。

公共列表&lt AuditTrailForm&gt getAuditTrailEntries(Class&lt ?&gt clazz, Serializable id) { AuditReader 阅读器 = AuditReaderFactory.get(this.getSession()); 列表 revNumbers = reader.getRevisions(clazz, id); 列出&lt AuditTrailForm&gt forms = new ArrayList(); 迭代器 it = revNumbers.iterator(); 而(it.hasNext()){ 编号项 = it.next(); 对象 obj = reader.find(clazz, id, item); AuditInfo 修订 = reader.findRevision(AuditInfo.class, item); BeanMap beanMap = new BeanMap(obj); HashMap map = new HashMap(); 设置键 = beanMap.keySet(); 迭代器 keyIterator = keys.iterator( ); 而(keyIterator.hasNext()){ String propertyName = (String) keyIterator.next(); if (beanMap.getType(propertyName).equals(String.class)) { String propertyValue = (String) beanMap.get( propertyName ); map.put(propertyName, propertyValue); } } 创建日期At = revision.getTimestamp(); 字符串用户 = 修订.getUser(); AuditTrailForm form = new AuditTrailForm(user, createdAt, map); forms.add(form); } 退货表格; }

工作正常,但是这没有考虑遍历类中的关系。
我能不能开发一种递归算法,检测对象属性的类型,然后进行递归调用?
有没有更好的方法可以做到这一点?

【问题讨论】:

  • 我理解审计,但我对 beanMap 的用途以及为什么要提取字符串值属性感到有点困惑。你能解释一下你想要达到的目标吗?
  • 最终我想要一个父子实体的“日期、用户、旧值、新值”的映射。问题是,如果我有休眠关系 C -> B 并且有人更改了 B 实体中的某些内容以及从 C 实体创建的新修订版,但我没有任何方法可以遍历 B 实体来自 C 版本。

标签: java hibernate hibernate-envers


【解决方案1】:

更简单的方法...

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

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

不完全符合您的要求,但会更容易实现并带来许多好处。您所要求的实施起来非常复杂。

【讨论】:

  • 我使用code.google.com/p/reflections 库实现了一个混乱的解决方案来检测可审计对象并遍历集合。在Envers的新版本发布之前,它满足了目前的要求。
猜你喜欢
  • 2015-01-21
  • 2013-02-08
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 2017-01-06
  • 1970-01-01
  • 2015-10-25
相关资源
最近更新 更多