【问题标题】:How to customize Hibernate EnVers如何自定义 Hibernate EnVers
【发布时间】:2018-08-18 06:53:58
【问题描述】:

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

我只知道用于实体审计的 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

谢谢。

【问题讨论】:

  • 您的解决方案是否暗示您需要读取给定 Employee 的所有审核行,ID 不超过特定修订号,以便合并差异以了解所有审核说明那个员工?这似乎比像 Envers 那样简单地存储快照的开销要大得多,从而使查询端变得直接、高效和简单。
  • 如果你考虑 Javers 或 Envers,这篇文章可以帮助你javers.org/blog/2017/12/javers-vs-envers-comparision.html
  • @Naros 你是对的,但我们只对差异感兴趣。
  • @BartekWalacik 感谢您的链接(我已经阅读了它),并为出色的工作做得很好:)

标签: java hibernate hibernate-envers javers


【解决方案1】:

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

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

JSON 字符串的存储并不理想,尤其是在关系数据库中,在尚未真正支持该数据类型的环境中更是如此。在 JSON 和字符 Blob 之间转换的写入和读取时间都会对性能造成影响,然后会在数据库中进行额外的查找和读/写操作,以将该 Blob 存储在远离其他列数据的单独区域中其未知/变化的大小。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-17
    • 2018-10-05
    • 2020-10-20
    • 2022-12-14
    • 2019-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多