为啥 Hibernate Envers 在更新时不启动?

Posted

技术标签:

【中文标题】为啥 Hibernate Envers 在更新时不启动?【英文标题】:Why Hibernate Envers not firing up on update?为什么 Hibernate Envers 在更新时不启动? 【发布时间】:2018-01-25 13:36:33 【问题描述】:

我正在使用 Hibernate Envers 来审核我的表的日志,它是使用 Spring 配置的。但是,当执行更新、修改或删除操作时,不会发生审计。以下是配置。

弹簧配置

<property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.bytecode.use_reflection_optimizer">true</prop>
                <prop key="hibernate.order_updates">true</prop>
                <prop key="hibernate.cache.use_second_level_cache">false</prop>
                <prop key="hibernate.query.substitutions">true 'Y', false 'N'</prop>

            <prop key="hibernate.connection.SetBigStringTryClob">true</prop>
            <prop key="hibernate.jdbc.use_streams_for_binary">true</prop>
            <prop key="SetBigStringTryClob">true</prop>

            <!--envers config-->
            <prop key="org.hibernate.envers.audit_table_suffix">_AUDITING</prop>
            <prop key="org.hibernate.envers.revision_field_name">revision_id</prop>
            <prop key="org.hibernate.envers.revision_type_field_name">revision_type</prop>

            <!--envers listners-->
            <prop key="hibernate.ejb.event.post-insert">org.hibernate.ejb.event.EJB3PostInsertEventListener,org.hibernate.envers.event.AuditEventListener</prop>
            <prop key="hibernate.ejb.event.post-update">org.hibernate.ejb.event.EJB3PostUpdateEventListener,org.hibernate.envers.event.AuditEventListener</prop>
            <prop key="hibernate.ejb.event.post-delete">org.hibernate.ejb.event.EJB3PostDeleteEventListener,org.hibernate.envers.event.AuditEventListener</prop>
            <prop key="hibernate.ejb.event.pre-collection-update">org.hibernate.envers.event.AuditEventListener</prop>
            <prop key="hibernate.ejb.event.pre-collection-remove">org.hibernate.envers.event.AuditEventListener</prop>
            <prop key="hibernate.ejb.event.post-collection-recreate">org.hibernate.envers.event.AuditEventListener</prop>

        </props>
    </property>

并且我已经在实体类中添加了@Audited 注解。我正在使用 Hibernate core 3.5.0-Final 和相同版本的 envers。

当我检查休眠记录的 sqls 时,我可以看到更新查询已执行,但没有任何查询将数据插入审计表。这里有什么问题?

【问题讨论】:

您是否看到在启动期间将 XML 休眠映射写入标准输出?我想确认的是 Envers 是否甚至在生成审计实体映射。 我删除了以上所有配置,并让它在默认设置下运行,并在实体类中使用@Audited 注解。即使它没有抱怨丢失的表,因为我没有使用 ddl.auto 来更新/创建。 Hibernate 工作正常,Envers 有问题 在使用 ORM 4.3 之前的任何版本时,您必须按照文档配置事件侦听器。但否则,正确配置侦听器并将 jar 放在类路径上应该足以让 Envers 开始审核带注释的实体。 我也检查了 envers 5.2。结果相同。我假设没有正确配置监听器。我在搜索时也发现了这些。 需要明确的是,使用 Envers 4.3+(包括 5.x)时,您不需要注册任何侦听器。当在类路径中找到 hibernate-envers 工件并作为 Hibernate ORM 引导过程的一部分进行引导时,这会自动发生。 【参考方案1】:

将 org.springframework.orm.hibernate3.LocalSessionFactoryBean 更改为 org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean 时问题解决

【讨论】:

有道理,很高兴你明白了。 感谢您的指导 :)

以上是关于为啥 Hibernate Envers 在更新时不启动?的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate Envers 修改了标志行为

Hibernate Envers - 获取日期之间的修订和对象

Hibernate-Envers:审计动态组件

Hibernate Envers:初始化 Envers 代理

Hibernate Envers @NotAudited 注解

在 Spring Hibernate java 项目中使用“Envers”审计表