1)当有一个新的实体或列被@Audited注释时,Hibernate Envers何时在架构中创建或更改审核表?
2)有没有一种方法可以记录添加新审计表或列时调用的mysql命令?
答案 0 :(得分:1)
当有一个新的实体或列被@Audited注释时,Hibernate Envers何时在架构中创建或更改审核表?
从技术上讲,Hibernate Envers根本不执行此操作,这整个步骤由Hibernate ORM适当地处理。 在Hibernate ORM引导期间,发生以下步骤:
是否有一种方法可以记录添加新审计表或列时调用的mysql命令?
有几种方法可以做到这一点,当然有些方法比其他方法更容易。
例如,您可以启用Hibernate SQL日志记录,使用您选择的日志记录API将这些条目配置为写入一个特殊的命名文件,然后将这些日志发送出去以按定义的时间间隔进行后处理。
您还可以考虑使用诸如Debezium之类的更独立的工具,该工具可以在事务/归档/ oplog / binlog级别监视数据库更改,并且对于某些连接器,它公开了专门存储DDL更改的Kafka主题。
答案 1 :(得分:0)
Hibernate-envers使用拦截器将更改插入试听表。在将事务提交到数据库之前立即调用它们。
这个问题还不清楚,如果您说的是mysql-commands,我想您的意思是像CREATE TABLE
和CREATE COLUMN
这样的更新查询。默认情况下,enver报告违反架构的行为。我可以想象-如果将试听表也作为休眠实体公开,则hbm2ddl可能会创建这些创建表和创建列更新查询。
毕竟,我建议使用“真相单源”概念(SSOVOT)和“快速故障转移”(FF),并敢于将数据库作为单点故障(SPOF)。
是的,hibernate插件称为enver,但从科学的角度来看,enver(实体版本)只是实体中标记为@Version
的版本属性。正确的名称是Audition,因为您过去一直将所有更改记录到数据库中的表中。
首先要说的是,实体表中的每个有效负载列都可以为空,您必须在试听表中添加一列,该列默认情况下为空值。但是,如果真正的表不允许在colmn中使用空值,那么试听就坏了!这将导致意外的问题。这意味着将真实列自动复制到已审计列必须是重构架构 AND数据的过程。