代码之家  ›  专栏  ›  技术社区  ›  chesterbr

hibernatemplate与envers一起工作吗?如果是这样,怎么办?

  •  2
  • chesterbr  · 技术社区  · 16 年前

    我试图在一个也使用hibernate和spring的项目中使用envers,我非常感谢hibernatemplate提供的代码缩减。

    我在JPA下配置了Enver,经过几次调整之后,我就可以拥有由EnviSbernTeToLoTaskAnt任务(包括审计表)生成的模式。但是,当我编写如下代码时:

        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>
    

    有人知道这是怎么回事吗?谢谢您!

    2 回复  |  直到 15 年前
        1
  •  2
  •   ChssPly76    16 年前

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

    之所以不能使用Hibernate模板是因为它依赖于JPA事件(可以看到在您的声明中的监听器)。 persistence.xml 在使用EntityManager时触发。当使用hibernatemplate时,理论上可以编写代码从hibernate会话中触发这些事件,但这是相当复杂的。

        2
  •  1
  •   Syed Mahdi    15 年前

    所有你需要做的就是在你的DAO或服务中调用事务,称为DAO,SAVER()/Update方法。

    即使您注册了eventlistener,这些事件也不会被触发,除非您使用spring fw的transnational。spring必须知道并告诉hibernate这些事件已经触发。

    推荐文章