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

时间:2019-01-03 17:08:46

标签: java hibernate audit hibernate-envers

考虑拥有合同,修订,维护,经销商等的汽车... 当合同中有更新时,将找到一个 revision_id 和一个 revision_timestemp ,如果您使用contract_aud,则可以通过reivsion_id找到新版本。

我的目标是向最终用户提供一个查询,让他可以问:在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.class(并且稍后获得汽车的ID)

我有20多个带有后缀_AUD的表,因此去数据库20次是没有意义的。

问题:如何查询日期与修订号和已更改的对象之间的修订。

2 个答案:

答案 0 :(得分:1)

您可以尝试在修订版本实体中使用III批注。

link有一些详细信息(未编入索引,搜索注释,您将找到它。)

使用注释并不是那么简单,因为注释会更改您正在使用的修订实体(即使它是提供的默认实体或任何自定义的实体)。

它将创建与每个修订版本关联的集合,并且在此集合中将包含在相关修订版本中更改的实体名称。

有了它,您可以在给定的时间窗口中查询修订,以及已更改的表。稍后,您可以使用修订时间戳记来更改事务中的每个实体。

如果您仍在开发中,那肯定会有所帮助,但是,如果您有生产运行中的系统,则仅对将来的更改有用。

答案 1 :(得分:0)

一种经典方法是使用左连接编写一个简单的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

奥卡姆剃须刀;-)