Envers Hibernate 记录 Creation/Altering 个表

Log Creation/Altering of Tables By Envers Hibernate

1) 当存在用@Audited 注释的新实体或列时,Hibernate Envers 何时在模式中创建或更改审计 table?

2) 有没有办法记录在有新审计 table 或添加列时调用的 mysql 命令?

  1. Hibernate-envers 使用拦截器将更改插入 audition-tables。它们在事务提交到数据库之前被调用。

  2. 这个问题有点不清楚,如果你说 mysql-commands 我猜你的意思是像 CREATE TABLECREATE COLUMN 这样的更新查询。默认情况下,enver 报告架构违规。我可以想象 - 如果您将 audition-tables 也公开为休眠实体 - hbm2ddl 可能会创建那些 create-table 和 create-column update-queries.

毕竟我建议使用单一真实版本概念 (SSOVOT) 和 failfast (FF),并敢于将数据库作为单一故障点 (SPOF)。

写法问题

是的,hibernate-plugin 叫做enver,但是从科学角度来看enver(entity-version) 只是实体中标有@Version 的版本-属性。正确的名称是试听,因为您历史上记录了数据库中 table 的所有更改。

如果 "change entity tables" 已经有行。

首先要说的是entity-tables中的每个payload-column都是可以为空的,你必须在audition-table中添加一个默认为空值的列。但是,如果正版 table 不允许列中有空值,则试听失败!这会导致意想不到的问题。这意味着真正的列自动复制到审计的列必须是一个重建模式的过程 AND DATA.

When does Hibernate Envers create or alter the audit tables in the schema when there is a new Entity or column that is annotated with @Audited?

从技术上讲,Hibernate Envers 根本不会这样做,这整个步骤都由 Hibernate ORM 适当处理。 在 Hibernate ORM bootstrap 期间,发生以下步骤:

  1. ORM 收集所有实体映射,这些映射在 XML 中定义并注释 类。 ORM 采用所有这些表示并构建我们所说的实体的启动模型表示。
  2. Envers 实现了一个特殊的挂钩,ORM 在准备好启动模型之后但在构建运行时模型之前立即调用该挂钩,ORM 将在之后使用该挂钩。这个钩子允许 Envers 结合带注释的 java 类 来解析引导模型,并为 ORM 创建额外的实体映射,以补充 (1) 中的内置内容。这些映射目前提供给 ORM 有额外的 Hibernate HBM XML 映射。
  3. 如果钩子产生任何额外的 HBM XML 映射,Hibernate ORM 也会通过将它们转换为引导模型表示来直接集成这些映射。
  4. 就在 Hibernate ORM 将此引导模型转换为运行时模型表示之前,ORM 构建映射的数据库表示。正是在这一点上,数据库模型在架构迁移(如果启用)到validate/update/create架构以匹配数据库模型表示。

Is there a way to log the mysql commands that are called when there is a new audit table or column added?

有多种方法可以完成此操作,当然有些方法比其他方法更容易。

例如,您可以启用 Hibernate SQL 日志记录,将这些条目配置为使用您选择的日志记录 API 写入特殊命名文件,然后将这些日志发送 post-按定义的时间间隔处理。

您还可以考虑使用更独立的东西,例如 Debezium,它能够在 transaction/archive/oplog/binlog 级别监视数据库更改,并且对于某些连接器公开专门存储 DDL 更改的 Kafka 主题。