【问题标题】:Hibernate Envers with JBoss, Spring and Maven - Doesn't write audit record使用 JBoss、Spring 和 Maven 的 Hibernate Envers - 不写入审计记录
【发布时间】:2012-12-17 00:05:39
【问题描述】:

我正在尝试结合 Spring、JBoss 和 Maven 实现 Hibernate Envers。

我有以下几点:

  • spring.version: 3.1.0.RELEASE
  • hibernate.version: 3.5.0-Final
  • log4j.版本:1.2.14
  • jboss-as-7.1.1.Final
  • mysql 数据库

在 pom.xml 中我添加了所需的 hibernate-envers:

    <dependency>    
        <groupId>org.hibernate</groupId>    
        <artifactId>hibernate-envers</artifactId>    
        <version>${hibernate.version}</version>
    </dependency>

在我的 Hibernate 持久性类中,我正在导入以下内容

import org.hibernate.envers.Audited;

看起来像

@Entity
@Indexed
@Audited 
@Table(name = "COM_TEST")
public class MyTest extends AbstractReferenceDataObject { ...

我已确保存在一个带有相关 DB 列的 COM_TEST_AUD 数据库表以及一个 REVINFO 数据库表。

当我运行我的代码时,它使用现有的休眠实现来更新 COM_TEST 中的记录。但是没有任何内容写入 COM_TEST_AUD 或 REVINFO db 表。

我的 persistence.xml 中有以下属性

    <properties>
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect"/>
        <property name="hibernate.connection.autocommit" value="true" />
        <property name="hibernate.hbm2ddl.auto" value="validate"/>
        <property name="hibernate.show_sql" value="false"/>
        <property name="hibernate.cache.use_second_level_cache" value="true"/>
        <property name="hibernate.cache.provider_class" value="net.sf.ehcache.hibernate.SingletonEhCacheProvider"/>
        <property name="hibernate.search.default.directory_provider" value="org.hibernate.search.store.FSDirectoryProvider"/>
        <property name="hibernate.search.default.indexBase" value="./lucene/indexes"/>
        <property name="hibernate.search.default.batch.merge_factor" value="10"/>
        <property name="hibernate.search.default.batch.max_buffered_docs" value="10"/>
    </properties>

我已经尝试了所有我能想到的东西。我可以看到当我启动 JBoss 时,它确实说明了它如何需要和优化 COM_TEST_AUD 和 REVINFO,所以看起来很有效。

我只是无法弄清楚为什么它不会写入数据库。日志文件中没有写入任何内容,我将日志记录设置为:

        <logger category="org.hibernate">
            <level name="DEBUG"/>
        </logger>

我注意到在下面的 JBoss 模块目录中它使用了 hibernate-envers-4.0.1.Final.jar:

jboss-as-7.1.1.Final\modules\org\hibernate\envers\main

我已将我的项目 pom.xml 更改为 4.0.1.Final 而不是 3.5.0-Final,但这并没有什么不同

有人可以帮忙吗?

【问题讨论】:

  • 首先要检查的是交易设置。你使用什么样的交易?例如,Envers 监听器是否会被调用?持久化一个实体?

标签: java spring hibernate jboss hibernate-envers


【解决方案1】:

由于您使用的是 Hibernate 3.x,因此您需要在 persistence.xml 中配置适当的 EventListener,如 Envers 文档的 Quickstart 部分所述:

<property name="hibernate.ejb.event.post-insert"
         value="org.hibernate.ejb.event.EJB3PostInsertEventListener,org.hibernate.envers.event.AuditEventListener" />
<property name="hibernate.ejb.event.post-update"
         value="org.hibernate.ejb.event.EJB3PostUpdateEventListener,org.hibernate.envers.event.AuditEventListener" />
<property name="hibernate.ejb.event.post-delete"
         value="org.hibernate.ejb.event.EJB3PostDeleteEventListener,org.hibernate.envers.event.AuditEventListener" />
<property name="hibernate.ejb.event.pre-collection-update"
         value="org.hibernate.envers.event.AuditEventListener" />
<property name="hibernate.ejb.event.pre-collection-remove"
         value="org.hibernate.envers.event.AuditEventListener" />
<property name="hibernate.ejb.event.post-collection-recreate"
         value="org.hibernate.envers.event.AuditEventListener" />

注意:您没有声明您正在通过 JPA 使用 Hibernate,但由于您提到了 persistence.xml,您似乎正在使用 JPA。如果现在是这种情况,那么配置会有些不同,您可以在文档中看到。

如果您使用的是 Hibernate 4.x,则此配置为 not needed

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-09
    • 2023-03-24
    • 2013-06-28
    • 1970-01-01
    • 2018-04-18
    • 2013-05-06
    • 1970-01-01
    • 2019-11-16
    相关资源
    最近更新 更多