Hibernate Envers - 获取日期之间的修订和对象
Posted
技术标签:
【中文标题】Hibernate Envers - 获取日期之间的修订和对象【英文标题】:Hibernate Envers - get revisions and objects between dates 【发布时间】:2019-05-30 07:22:10 【问题描述】:考虑一辆有合同、修改、维护、经销商等的汽车...... 当合同中有更新时,您会找到 revision_id 和 revision_timestemp,如果您转到 contract_aud,您可以通过 reivsion_id 找到新版本。
我的目标是向最终用户提供一个他可以询问的查询:cars(复数)在 startDate 和 endDate 之间有哪些修订。请注意,修订可以在合同/维护/经销商等...(我只关心汽车的 ID)
根据我今天的情况,可以通过以下方式按日期查询:
AuditReader auditReader = AuditReaderFactory.get(em);
AuditQuery q = auditReader.createQuery().forRevisionsOfEntity(Car.class, false, true);
q.add(AuditEntity.revisionProperty("timestamp").ge(startDate.getTime()));
q.add(AuditEntity.revisionProperty("timestamp").lt(endDate.getTime()));
但您可以注意到,我发送的是 Car.class,如果在“contract”中进行了修订,我将不得不发送 Contract.class(以及稍后获取汽车的 ID)
我有 20 多个带有后缀 _AUD 的表,所以去数据库 20 次是没有意义的。
问题:如何查询日期和修订号之间发生的修订以及已更改的对象。
【问题讨论】:
【参考方案1】:您可以尝试在修订实体中使用@ModifiedEntityNames
注释。
这个link有一些细节(它没有被索引,搜索注释,你会找到它。)
使用注释并不是那么简单,因为它会更改您正在使用的修订实体(即使它是提供的默认值或任何自定义)。
它将创建一个与每个修订关联的集合,并且在此集合中将包含在相关修订中更改的实体名称。
有了这些,您可以查询给定时间窗口内的修订,以及已更改的表。稍后您可以使用修订时间戳来更改事务中的每个实体。
如果您仍处于开发阶段,那么它肯定会有所帮助,但如果您有一个正在运行的生产系统,那么它只会对未来的更改有用。
【讨论】:
【参考方案2】:一个经典的方法是编写一个带有左连接的简单 SQL 语句,为每个表提供日期和修订。目的仅仅是接收 CAR id,而不进行任何修订解释。
SELECT ri.revision_id, ri.revision_timestamp, s.id supplier_id ...
from revinfo as ri
left join ...
left join...
where ri.revision_timestamp
between 1546530449341 and 1546532280293
奥卡姆剃刀;-)
【讨论】:
以上是关于Hibernate Envers - 获取日期之间的修订和对象的主要内容,如果未能解决你的问题,请参考以下文章
Hibernate Envers 如何通过 EmbeddedId 的属性获取修订
Hibernate Envers:初始化 Envers 代理