【问题标题】:Hibernate Interceptors or Events for Audit Trail?用于审计跟踪的 Hibernate 拦截器或事件?
【发布时间】:2011-04-26 13:12:30
【问题描述】:

我记录了对某些实体的所有更改的历史记录,并且即将实现类似于Envers 的机制来自动处理这个问题。我的问题是是否使用Hibernate interceptors or their event system

拦截器似乎更简单一些,可以满足我的所有需求。 Hibernate 自己的文档建议使用拦截器来“跟踪审计信息”。但是他们的审计信息不在每个实体的配套表中,Envers 使用我想象的事件系统是有原因的。

我正在使用 Spring 3.0 和 Hibernate 3.5(最新版本)。

更新:数据库触发器不适用于这种情况。我很想听听关于休眠拦截器与审计跟踪/更改历史的事件的想法。

【问题讨论】:

  • 数据库触发器将是我的首选方法。比使用 Hibernate 的拦截器更简单。
  • DB 触发器在我的应用中并不容易。我需要在每个审计条目中记录额外的信息,包括还原到的更改、每次更改所基于的更改等,以及处理集合的级联机制。
  • @skaffman:触发器将逻辑移动到数据库层。使用 ORM 有助于我们将逻辑保留在应用层中它所属的位置。
  • @cherouvim:嗯,这是一种观点。我认为审计表是关于数据完整性,而不是业务逻辑,并且确实属于数据库。
  • 我会覆盖 EmptyInterceptor。它简单易用。 IMO 最好的事情是 AfterTransactionComplete-Method。使用其他方法收集更改,并在 AfterTxComplete 中检查 Tx-State 并在成功后保留您的 Audit-Logs,然后再 Interceptor-Reset。

标签: hibernate spring interceptor audit-trail hibernate-envers


【解决方案1】:

我认为两者的本质区别在于你只能在你的SessionFactory中定义一个Interceptor,但是你可以为一个特定的事件注册多个监听器。

我将使用拦截器,因为我只想要一些非常简单的东西:创建我的实体时的时间戳(@Version 注释负责更新 lastModified 属性)。

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
            <prop key="hibernate.hbm2ddl.auto">create</prop>
        </props>
    </property>
    <property name="packagesToScan" value="com.x.domain" />
    <property name="entityInterceptor" ref="onSaveInterceptor" />
</bean>

http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/events.html#objectstate-interceptors

【讨论】:

    猜你喜欢
    • 2017-02-07
    • 1970-01-01
    • 2021-07-04
    • 2017-01-22
    • 2018-02-26
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    相关资源
    最近更新 更多