使用来自Hibernate实体的现有数据填充修订表

dan*_*nez 21 java hibernate hibernate-envers

我正在为现有的hibernate实体添加envers.到目前为止,审计工作一切顺利,但查询是一个不同的问题,因为修订表没有填充现有数据.还有其他人已经解决了这个问题吗?也许您已经找到了一些方法来使用现有表填充修订表?我想我会问,我相信其他人会发现它很有用.

小智 14

我们通过运行一系列原始SQL查询来填充初始数据,以模拟"插入"所有现有实体,就像它们刚刚同时创建一样.例如:

insert into REVINFO(REV,REVTSTMP) values (1,1322687394907); 
-- this is the initial revision, with an arbitrary timestamp

insert into item_AUD(REV,REVTYPE,id,col1,col1) select 1,0,id,col1,col2 from item; 
-- this copies the relevant row data from the entity table to the audit table
Run Code Online (Sandbox Code Playgroud)

请注意,REVTYPE值为0表示插入(与修改相反).


use*_*656 6

如果您使用Envers ValidityAuditStrategy并且已经创建了除启用Envers以外的数据,则此类别中存在问题.

在我们的例子中(Hibernate 4.2.8.Final),基本对象更新抛出"无法更新实体的先前版本和"(记录为[org.hibernate.AssertionFailure] HHH000099).

花了一些时间才发现这个讨论/解释,所以交叉发布:

ValidityAuditStrategy没有审计记录


Vla*_*nov 5

你不需要.
AuditQuery允许您通过以下方式获取RevisionEntity和数据修订:

AuditQuery query = getAuditReader().createQuery()
                .forRevisionsOfEntity(YourAuditedEntity.class, false, false);
Run Code Online (Sandbox Code Playgroud)

这将构造一个返回Object [3]列表的查询.Fisrt元素是您的数据,第二个是修订实体,第三个是修订类型.