HibernateTemplate是否可以与Envers一起使用?如果是这样,怎么样? [英] Does HibernateTemplate work with Envers? If so, how?

查看:90
本文介绍了HibernateTemplate是否可以与Envers一起使用?如果是这样,怎么样?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图在一个也使用Hibernate和Spring的项目上使用Envers,并且我非常欣赏HibernateTemplate提供的代码缩减。

I am trying to use Envers on a project that also uses Hibernate and Spring - and I appreciate a lot the code reduction offered by HibernateTemplate.

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

I configured Envers under JPA, and after a few tweaks I was able to have the schema generated by the EnversHibernateToolTask Ant task (including the auditing tables). However, when I write code such as:

    hibernateTemplate.saveOrUpdate(f);

数据是持久的,但没有任何内容可以发送到审计表。相反,如果我写:

the data is persisted, but nothing goes to the auditing tables. Conversely, if I write:

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

然后数据传到审计表(但我宁愿使用前面的语法 - 我知道使用JPA的EntityManager将这些代码从Hibernate中分离出来,但它简单并不能解决麻烦 - 更改ORM引擎并不是我对这个项目的最大梦想。)

then data goest to the audit tables (but I'd rather use the former syntax - I know using JPA's EntityManager decouples that code from Hibernate, but it simple does not pay off the hassle - changing ORM engine is not in my wildest dreams for this project.)

检查我的 applicationContext.xml 配置:

It may help to check my applicationContext.xml configuration:

<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>

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

Does anyone have a hint on what is going on here? Thank you!

推荐答案

HibernateTemplate有其JPA副本, JpaTemplate ,它提供了一个相当类似的功能。

HibernateTemplate has its JPA counterpart, JpaTemplate which provides a fairly similar functionality.

Envers不支持HibernateTemplate的原因是它依赖于JPA事件(你可以看到上面的 persistence.xml 中声明的监听器),当EntityManager是用过的。当使用HibernateTemplate时,理论上可以编写代码来从Hibernate会话中触发这些事件,但是它涉及很多。

The reason Envers doesn't work with HibernateTemplate is because it relies on JPA events (you can see the listeners declared in your persistence.xml above) triggered when EntityManager is used. It's possible in theory to write code to trigger those events from Hibernate session when HibernateTemplate is used, but it's rather involved.

这篇关于HibernateTemplate是否可以与Envers一起使用?如果是这样,怎么样?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆