如何自定义Hibernate EnVers

时间:2018-03-09 16:33:11

标签: java hibernate hibernate-envers javers

我们正在设计具有两个特定要求的实体审计库:每个实体一个表和增量日志(JSON diff)不是(完整快照)。

我只知道用于实体审核的Hibernate EnVers和JaVers。 (如果有其他事情请告诉我。)并且没有一个满足我们的要求。

我们已经知道审计记录是什么样的,并且我们希望在实施库时尽可能多地重复使用。我想将Hibernate EnVers添加为依赖项并定制/扩展它以支持我们的需求。

第一个问题是,考虑到我们的需求和我们的平台(我们使用Spring + JPA + Hibernate),JaVers而不是Hibernate EnVers是否有任何强烈的争论?

假设第一个问题的答案是否定的,我们将继续使用Hibernate EnVers,Hibernate EnVers的扩展范围是什么?而且,除了一些超级简单的例子,我还找不到任何关于如何完成它的资源。有没有?我在哪里可以开始?

我们的设计或多或少如下:

Entity Table
Employees (EmployeeId, FirstName, LastName, DepartmentId, ...)

Audit Table
Employees_AUD (EmployeeId, Diff, REV, REVTYPE)
-- EmployeeId: employee ID
-- Diff: diff of the two states of entity
-- REV: revision id (Hinbernate EnVers)
-- REVTYPE: revision type (Hinbernate EnVers)

REVINFO Table:
-- Original table created by Hibernate EnVers

感谢。

1 个答案:

答案 0 :(得分:0)

Envers不能以您描述的方式扩展

您所描述的内容需要完全替换实体模型的元数据处理,以及如何为ORM生成XML模式,以及在ORM事务期间如何使用映射器来读取和写入实体{{1} }查询。简而言之,它最终成为设计范式的转变,影响了相当多的内部功能。

JSON字符串的存储并不理想,特别是在关系数据库上,在尚未真正支持该数据类型的环境中更是如此。您在写入和读取时间都会遇到性能损失,无法在JSON和字符Blob之间进行转换,然后在数据库中进行额外的搜索和读/写操作,以将该Blob存储在远离其他列数据的单独区域中由于其未知/不同的大小。

虽然有数据库平台可以帮助解决上述问题,但仍然值得注意的是,尤其是在审计工具中,当数据发生变化时,您可能会处理大量的行。

我相信最接近的Envers可以来到这里,可以实现一个配置选项,允许我们仍然维护一个基于列的审计表,但只隐藏每个快照而不是所有列的修改列。

我们必须看到的是,这对AuditReader API有多大影响。如果您想看到这些内容,请随时打开JIRA并提交PR以供我审核。