Hibernate Envers - 获取日期之间的修订和对象

Posted

技术标签:

【中文标题】Hibernate Envers - 获取日期之间的修订和对象【英文标题】:Hibernate Envers - get revisions and objects between dates 【发布时间】:2019-05-30 07:22:10 【问题描述】:

考虑一辆有合同、修改、维护、经销商等的汽车...... 当合同中有更新时,您会找到 revision_idrevision_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 代理

Hibernate-Envers:审计动态组件

如何配置 Hibernate Envers 以避免实体修订查询中的某些集合(连接表)

Hibernate Envers

Hibernate Envers @NotAudited 注解