【发布时间】:2020-03-11 00:29:22
【问题描述】:
1) 当有一个用@Audited 注释的新实体或列时,Hibernate Envers 何时创建或更改架构中的审计表?
2) 有没有办法记录添加新审计表或列时调用的 mysql 命令?
【问题讨论】:
标签: java mysql spring hibernate hibernate-envers
1) 当有一个用@Audited 注释的新实体或列时,Hibernate Envers 何时创建或更改架构中的审计表?
2) 有没有办法记录添加新审计表或列时调用的 mysql 命令?
【问题讨论】:
标签: java mysql spring hibernate hibernate-envers
当存在使用@Audited 注释的新实体或列时,Hibernate Envers 何时创建或更改架构中的审计表?
从技术上讲,Hibernate Envers 根本不这样做,整个步骤都由 Hibernate ORM 处理。 在 Hibernate ORM 的引导过程中,会发生以下步骤:
有没有办法记录添加新审计表或列时调用的 mysql 命令?
有几种方法可以做到这一点,当然有些比其他更容易。
例如,您可以启用 Hibernate SQL 日志记录,使用您选择的日志记录 API 将这些条目配置为写入一个特殊的命名文件,然后将这些日志发送出去以在定义的时间间隔进行后期处理。
您还可以考虑使用更独立的东西,例如 Debezium,它能够在事务/存档/oplog/binlog 级别监控数据库更改,并且某些连接器公开了专门存储 DDL 更改的 Kafka 主题。
【讨论】:
Hibernate-envers 正在使用拦截器将更改插入到试听表中。它们在事务提交到数据库之前被调用。
这个问题有点不清楚,如果你说 mysql-commands,我猜你的意思是更新查询,如 CREATE TABLE 和 CREATE COLUMN。默认情况下,enver 会报告针对模式的违规行为。我可以想象 - 如果您也将试听表公开为休眠实体 - hbm2ddl 可能会创建这些 create-table 和 create-column 更新查询。
毕竟我建议使用单一来源的真实版本概念 (SSOVOT) 和故障快速 (FF),并敢于将数据库作为单一故障点 (SPOF)。
是的,hibernate-plugin 被称为 enver,但从科学观点来看,enver(entity-version) 只是实体中标有@Version 的版本属性。正确的名称是 audition,因为您在历史上记录了数据库中表的所有更改。
首先要说的是实体表中的每个有效负载列都可以为空,您必须在试听表中添加一个列,它默认为空值。但是如果正版表不允许在列中有空值,试听就会失败!这会导致意想不到的问题。这意味着真实列到审计列的自动复制必须是重构架构AND DATA的过程。
【讨论】: