有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何定制Hibernate环境

我们设计的实体审计库有两个特定的要求:每个实体一个表和增量日志(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) 个答案

  1. # 1 楼答案

    环境不能以您描述的方式扩展

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

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

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

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

    我们必须看到的是,这对AuditReaderAPI有多大的影响。如果这是你想看到的,请随意打开JIRA并提交PR供我审核