通过休眠休眠创建/更改表的日志

时间:2019-11-14 21:53:23

标签: java mysql spring hibernate hibernate-envers

1)当有一个新的实体或列被@Audited注释时,Hibernate Envers何时在架构中创建或更改审核表?

2)有没有一种方法可以记录添加新审计表或列时调用的mysql命令?

2 个答案:

答案 0 :(得分:1)

  

当有一个新的实体或列被@Audited注释时,Hibernate Envers何时在架构中创建或更改审核表?

从技术上讲,Hibernate Envers根本不执行此操作,这整个步骤由Hibernate ORM适当地处理。 在Hibernate ORM引导期间,发生以下步骤:

  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会建立映射的数据库表示形式。正是在这一点上,在模式迁移(如果启用)中使用数据库模型来验证/更新/创建模式以匹配数据库模型表示形式。
  

是否有一种方法可以记录添加新审计表或列时调用的mysql命令?

有几种方法可以做到这一点,当然有些方法比其他方法更容易。

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

您还可以考虑使用诸如Debezium之类的更独立的工具,该工具可以在事务/归档/ oplog / binlog级别监视数据库更改,并且对于某些连接器,它公开了专门存储DDL更改的Kafka主题。

答案 1 :(得分:0)

  1. Hibernate-envers使用拦截器将更改插入试听表。在将事务提交到数据库之前立即调用它们。

  2. 这个问题还不清楚,如果您说的是mysql-commands,我想您的意思是像CREATE TABLECREATE COLUMN这样的更新查询。默认情况下,enver报告违反架构的行为。我可以想象-如果将试听表也作为休眠实体公开,则hbm2ddl可能会创建这些创建表和创建列更新查询。

毕竟,我建议使用“真相单源”概念(SSOVOT)和“快速故障转移”(FF),并敢于将数据库作为单点故障(SPOF)。

措辞问题

是的,hibernate插件称为enver,但从科学的角度来看,enver(实体版本)只是实体中标记为@Version的版本属性。正确的名称是Audition,因为您过去一直将所有更改记录到数据库中的表中。

如果“更改实体表”已经具有行。

首先要说的是,实体表中的每个有效负载列都可以为空,您必须在试听表中添加一列,该列默认情况下为空值。但是,如果真正的表不允许在colmn中使用空值,那么试听就坏了!这将导致意外的问题。这意味着将真实列自动复制到已审计列必须是重构架构 AND数据的过程。