java - HibernateTemplate 可以与 Envers 一起使用吗?如果是这样,怎么办?

标签 java hibernate spring jpa hibernate-envers

我正在尝试在一个也使用 Hibernate 和 Spring 的项目上使用 Envers - 我非常欣赏 HibernateTemplate 提供的代码减少功能。

我在 JPA 下配置了 Envers,经过一些调整后,我能够获得由 EnversHibernateToolTask​​ Ant 任务生成的模式(包括审核表)。但是,当我编写如下代码时:

    hibernateTemplate.saveOrUpdate(f);

数据被持久化,但没有任何内容进入审计表。相反,如果我写:

    EntityManager em = emf.createEntityManager();
    em.getTransaction().begin();
    em.persist(f);
    em.getTransaction().commit();

然后数据进入审计表(但我宁愿使用以前的语法 - 我知道使用 JPA 的 EntityManager 将该代码与 Hibernate 解耦,但它简单并不能消除麻烦 - 更改 ORM 引擎并不是我最疯狂的这个项目的梦想。)

检查我的 applicationContext.xml 配置可能会有所帮助:

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="projetox" />
    <property name="dataSource" ref="dataSource" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="showSql" value="true" />
        </bean>
    </property>
</bean>
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="com.w2it.projetox.model" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
        </props>
    </property>
</bean>

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    ...
</bean>

这是我的 persistence.xml 设置:

<persistence-unit name="projetox" transaction-type="RESOURCE_LOCAL">
    <jta-data-source>java:/DefaultDS</jta-data-source>
    <properties>
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
        <!--  Hibernate Envers -->
        <property name="hibernate.ejb.event.post-insert"
            value="org.hibernate.envers.event.AuditEventListener" />
        <property name="hibernate.ejb.event.post-update"
            value="org.hibernate.envers.event.AuditEventListener" />
        <property name="hibernate.ejb.event.post-delete"
            value="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" />
    </properties>
</persistence-unit>

有人知道这里发生了什么吗?谢谢!

最佳答案

HibernateTemplate 有其 JPA 对应项 JpaTemplate它提供了相当相似的功能。

Envers 不能与 HibernateTemplate 配合使用的原因是它依赖于使用 EntityManager 时触发的 JPA 事件(您可以在上面的 persistence.xml 中看到声明的监听器)。理论上,当使用 HibernateTemplate 时,可以编写代码来触发 Hibernate session 中的这些事件,但它相当复杂。

关于java - HibernateTemplate 可以与 Envers 一起使用吗?如果是这样,怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1647894/

相关文章:

java - 应用程序配置,Bean 到 xml

java - 谷歌驱动器导出非谷歌文档文件

java - GWT XML 模式

java - 为什么 List<T>.toArray() 返回泛型 Object[] 而不是 T[]?

java - Spring-Hibernate 中的每个线程都应该有一个 EntityManager 吗?

java - 将对象保存到数据库时使用hibernate

java - servlet 的 Hibernate 超时问题

java - Thread.sleep 对等待 Windows 完成文件创建/移动的可运行任务的影响

java - org.hibernate.MappingException : Could not determine type for: java. util.Set,在表 : Company, 的列 : [org. hibernate.mapping.Column(users)]

java - 正确使用 TransportClient 进行 Elasticsearch