如何自定义 Hibernate EnVers

How to customize Hibernate EnVers

我们正在根据两个特定要求设计我们的实体审计库:每个实体一个 table 和增量日志(JSON 差异)而不是(完整快照)。

我只知道用于实体审计的 Hibernate EnVers 和 JaVers。 (如果还有什么请告诉我。)其中 none 满足我们的要求。

我们已经知道审计记录是什么样子的,我们希望在实施该库时尽可能多地重复使用。我正在考虑将 Hibernate EnVers 添加为依赖项并 customizing/extending 它来支持我们的需求。

第一个问题是,考虑到我们的需求和我们的平台(我们使用 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

谢谢。

Envers 不能按照您描述的方式扩展

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

JSON 字符串的存储并不理想,特别是在关系数据库中,在尚未真正支持 data-type 的环境中更是如此。在 JSON 和 Character Blob 之间进行转换会导致写入和读取时间的性能下降,然后在数据库中进行额外的查找和 read/write 以将该 blob 存储在远离另一列数据凭借其 unknown/varying 大小。

虽然有一些数据库平台可以帮助解决上述问题,但仍然值得特别注意的是,在审计工具中,您可能会在数据更改时处理大量行。

我相信最接近 Envers 的可能是实现一个配置选项,它允许我们仍然维护 column-based 审计 table 但只存储每个快照的修改列而不是比所有列。

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