Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用HibernateEnvers进行审计_Java_Spring_Hibernate_Hibernate Envers - Fatal编程技术网

Java 使用HibernateEnvers进行审计

Java 使用HibernateEnvers进行审计,java,spring,hibernate,hibernate-envers,Java,Spring,Hibernate,Hibernate Envers,我正在使用hibernate envers创建数据的历史记录,它也工作得很好。这里的问题是,它在历史记录表中创建重复数据,即在历史记录表中创建数据,无论审核表是否有任何更改。我只希望在历史记录表中存储更改的字段。我不熟悉冬眠。我能做什么?如果我正确理解了你的问题,Envers不会那样工作,至少不会开箱即用 Envers是一个提交快照审核解决方案,在提交之前,它检查已审核的实体状态,确定是否修改了任何属性,并记录该实体在该时间点的所有已审核字段的快照。这意味着只有在没有修改属性的情况下才不会创建审

我正在使用hibernate envers创建数据的历史记录,它也工作得很好。这里的问题是,它在历史记录表中创建重复数据,即在历史记录表中创建数据,无论审核表是否有任何更改。我只希望在历史记录表中存储更改的字段。我不熟悉冬眠。我能做什么?

如果我正确理解了你的问题,Envers不会那样工作,至少不会开箱即用

Envers是一个提交快照审核解决方案,在提交之前,它检查已审核的实体状态,确定是否修改了任何属性,并记录该实体在该时间点的所有已审核字段的快照。这意味着只有在没有修改属性的情况下才不会创建审核条目

但它也使用快照方法,因为它非常适合查询API

考虑一下,如果要在给定修订中查找实体的查询必须将该修订中的所有行读取回时间的开始,迭代每一行并合并捕获的列状态以仅实例化一个单行结果集,则会出现效率低下的情况

使用快照方法,可以归结为以下查询,没有循环或迭代工作

SELECT e FROM AuditedEntity e WHERE e.revisionNumber = :revisionNumber
从I/O的角度来看,这要高效得多,因为数据库读取数据页,网络将单行结果集而不是多行结果集流式传输到客户端

我要说的是,在这种情况下,当您将空间便宜这一说法与您的应用程序以任何其他方式进行操作时所面临的成本和低效进行比较时,这一说法确实成立

如果这是您希望Envers支持的功能,可能是通过一些用户配置的策略,那么欢迎您登录hibernate Envers的新功能请求,我可以看看它的可行性。

我也有类似的问题


在我的例子中,错误是审计字段的精度高于数据库字段。请参阅我对另一个线程的回复:

请提供您迄今为止尝试过的相关解决方案。@Garren-我已经尝试过审计注释,但问题是历史记录表中存在重复数据。还有其他方法吗?