gpt4 book ai didi

java - 如何自定义 Hibernate EnVers

转载 作者:行者123 更新时间:2023-12-02 11:32:25 26 4
gpt4 key购买 nike

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

我只知道用于实体审计的 Hibernate EnVers 和 JaVers(如果还有其他请告诉我),它们都不满足我们的要求。

我们已经知道审计记录是什么样的,并且我们希望在实现该库时尽可能地重复使用。我正在考虑添加 Hibernate EnVers 作为依赖项并自定义/扩展它来支持我们的需求。

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

假设第一个问题的答案是否定的,并且我们将使用 Hibernate EnVers,那么 Hibernate EnVers 可扩展到什么程度?而且,除了一些 super 简单的例子之外,我找不到任何关于如何准确做到这一点的资源。有没有?我可以从哪里开始?

我们的设计大致如下:

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

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

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

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

关于java - 如何自定义 Hibernate EnVers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49198202/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com