1) 当有一个新的实体或列被@audited注解时,hibernate enver什么时候创建或更改模式中的审计表?2) 有没有办法记录在添加新的审计表或列时调用的mysql命令?
pvcm50d11#
当有一个新的实体或列被@audited注解时,hibernate enver什么时候创建或更改模式中的审计表?从技术上讲,hibernate envers根本不这样做,整个步骤都由hibernate orm来处理。在hibernate orm的引导过程中,会发生以下步骤:orm收集所有实体Map,那些在xml和注解类中定义的实体Map。orm接受所有这些表示并构建我们称之为实体的引导模型表示。envers实现了一个特殊的钩子,orm在准备好启动模型之后,但在构建运行时模型之前,立即调用这个钩子,orm随后使用这个钩子。这个钩子允许enver结合带注解的java类解析引导模型,并为orm创建额外的实体Map,以补充内置的(1)。这些Map当前提供给orm,并具有其他hibernate hbm xmlMap。如果钩子产生任何额外的hbm xmlMap,那么hibernate orm也可以通过将它们转换为引导模型来直接集成这些Map。就在hibernate orm将这个引导模型转换为运行时模型表示之前,orm构建Map的数据库表示。此时,在模式迁移(如果启用)期间使用数据库模型来验证/更新/创建模式以匹配数据库模型表示。有没有办法记录在添加新的审计表或列时调用的mysql命令?有几种方法可以做到这一点,当然有些方法比其他方法更容易。例如,您可以启用hibernatesql日志记录,使用您选择的日志api将这些条目配置为写入一个特殊的命名文件,然后按照定义的时间间隔将这些日志发送出去进行后处理。您还可以考虑使用更独立的工具,例如debezium,它能够在事务/归档/oplog/binlog级别监视数据库更改,并且对于某些连接器,它公开了一个专门存储ddl更改的kafka主题。
emeijp432#
HibernateEnvers正在使用拦截器将更改插入到试听表中。在事务提交到数据库之前调用它们。这个问题有点不清楚,如果你说mysql命令,我猜你的意思是像这样的更新查询 CREATE TABLE 以及 CREATE COLUMN . 默认情况下,enver会报告与模式的冲突。我可以想象,如果将试听表也公开为hibernate实体,hbm2ddl可能会创建那些create table和create column update查询。毕竟我建议使用真值概念(ssovot)和failfast(ff)的单一版本源,并将数据库作为faliure的单一点(spof)。
CREATE TABLE
CREATE COLUMN
是的,hibernate插件被称为enver,但是从科学的Angular 来看,enver(实体版本)只是标有的version属性 @Version 在实体中。正确的名称是audition,因为您在历史上记录了对数据库中表的所有更改。
@Version
首先要说的是,实体表中的每个有效负载列都是可以为null的,您必须在audition表中添加一个默认为null的列。但是如果真正的表不允许列中有空值,那么试听就失败了!这将导致意想不到的问题。这意味着将真正的列自动复制到已审核的列必须是一个重构模式和数据的过程。
2条答案
按热度按时间pvcm50d11#
当有一个新的实体或列被@audited注解时,hibernate enver什么时候创建或更改模式中的审计表?
从技术上讲,hibernate envers根本不这样做,整个步骤都由hibernate orm来处理。在hibernate orm的引导过程中,会发生以下步骤:
orm收集所有实体Map,那些在xml和注解类中定义的实体Map。orm接受所有这些表示并构建我们称之为实体的引导模型表示。
envers实现了一个特殊的钩子,orm在准备好启动模型之后,但在构建运行时模型之前,立即调用这个钩子,orm随后使用这个钩子。这个钩子允许enver结合带注解的java类解析引导模型,并为orm创建额外的实体Map,以补充内置的(1)。这些Map当前提供给orm,并具有其他hibernate hbm xmlMap。
如果钩子产生任何额外的hbm xmlMap,那么hibernate orm也可以通过将它们转换为引导模型来直接集成这些Map。
就在hibernate orm将这个引导模型转换为运行时模型表示之前,orm构建Map的数据库表示。此时,在模式迁移(如果启用)期间使用数据库模型来验证/更新/创建模式以匹配数据库模型表示。
有没有办法记录在添加新的审计表或列时调用的mysql命令?
有几种方法可以做到这一点,当然有些方法比其他方法更容易。
例如,您可以启用hibernatesql日志记录,使用您选择的日志api将这些条目配置为写入一个特殊的命名文件,然后按照定义的时间间隔将这些日志发送出去进行后处理。
您还可以考虑使用更独立的工具,例如debezium,它能够在事务/归档/oplog/binlog级别监视数据库更改,并且对于某些连接器,它公开了一个专门存储ddl更改的kafka主题。
emeijp432#
HibernateEnvers正在使用拦截器将更改插入到试听表中。在事务提交到数据库之前调用它们。
这个问题有点不清楚,如果你说mysql命令,我猜你的意思是像这样的更新查询
CREATE TABLE
以及CREATE COLUMN
. 默认情况下,enver会报告与模式的冲突。我可以想象,如果将试听表也公开为hibernate实体,hbm2ddl可能会创建那些create table和create column update查询。毕竟我建议使用真值概念(ssovot)和failfast(ff)的单一版本源,并将数据库作为faliure的单一点(spof)。
措辞问题
是的,hibernate插件被称为enver,但是从科学的Angular 来看,enver(实体版本)只是标有的version属性
@Version
在实体中。正确的名称是audition,因为您在历史上记录了对数据库中表的所有更改。如果“更改实体表”已经有行。
首先要说的是,实体表中的每个有效负载列都是可以为null的,您必须在audition表中添加一个默认为null的列。但是如果真正的表不允许列中有空值,那么试听就失败了!这将导致意想不到的问题。这意味着将真正的列自动复制到已审核的列必须是一个重构模式和数据的过程。