Java Envers Hibernate创建/更改表的日志

Java Envers Hibernate创建/更改表的日志,java,mysql,spring,hibernate,hibernate-envers,Java,Mysql,Spring,Hibernate,Hibernate Envers,1) 当有一个新实体或列被@Audited注释时,Hibernate Envers何时在模式中创建或更改审核表 2) 有没有办法记录添加新审计表或列时调用的mysql命令 HibernateEnvers正在使用拦截器将更改插入试听表。在事务提交到数据库之前调用它们 问题有点不清楚,如果你说mysql命令,我想你是指更新查询,比如createtable和createcolumn。默认情况下,enver报告违反模式的行为。我可以想象,如果您将试听表也公开为hibernate实体,hbm2ddl可能会

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

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

  • HibernateEnvers正在使用拦截器将更改插入试听表。在事务提交到数据库之前调用它们

  • 问题有点不清楚,如果你说mysql命令,我想你是指更新查询,比如
    createtable
    createcolumn
    。默认情况下,enver报告违反模式的行为。我可以想象,如果您将试听表也公开为hibernate实体,hbm2ddl可能会创建这些创建表和创建列更新查询

  • 毕竟,我建议使用真理概念版本(SSOVOT)和failfast(FF)的单一来源,并将数据库作为faliure的单一点(SPOF)

    措辞问题 是的,hibernate插件名为enver,但从科学角度来看,enver(实体版本)只是实体中标记为
    @version
    的版本属性。正确的名称是audition,因为您在历史上记录了对数据库中表的所有更改

    如果“更改实体表”已经有行。 首先要说的是,实体表中的每个有效负载列都是可以为null的,您必须在audition表中添加一列,默认情况下该列具有null值。但是如果真正的表不允许列中有空值,那么试听就被破坏了!这将导致意想不到的问题。这意味着将正版列自动复制到已审核列必须是一个重建架构和数据的过程

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

    从技术上讲,HibernateEnvers根本不这样做,整个步骤都由HibernateORM来处理。 在Hibernate ORM的引导过程中,会发生以下步骤:

  • ORM收集所有实体映射,这些映射是在XML和注释类中定义的。ORM接受所有这些表示,并构建我们称之为实体的引导模型表示
  • Envers实现了一个特殊的钩子,ORM在准备好启动模型之后,但在构建运行时模型之前,立即调用该钩子,ORM随后使用该钩子。这个钩子允许Envers结合带注释的java类解析引导模型,并为ORM创建额外的实体映射,以补充内置的(1)。这些映射目前提供给ORM,ORM还有其他Hibernate HBM XML映射
  • 如果钩子生成任何额外的HBM XML映射,Hibernate ORM也会通过将它们转换为引导模型表示来直接集成这些映射
  • 就在Hibernate ORM将此引导模型转换为运行时模型表示之前,ORM构建映射的数据库表示。正是在这一点上,在模式迁移(如果启用)期间使用数据库模型来验证/更新/创建模式以匹配数据库模型表示
  • 有没有办法记录添加新审计表或列时调用的mysql命令

    有几种方法可以实现这一点,当然有些方法比其他方法更简单

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


    您还可以考虑使用更独立的工具,例如Debe,它能够监视事务/存档/ OPLOG/BILLO级别的数据库更改,并且某些连接器公开了专门存储DDL更改的卡夫卡主题。这个答案无所不包。非常感谢。除了Naros所说的之外,我们最近还做了大量的关于使用Debezium/CDC构建审计日志的研究。欢迎反馈!