我正尝试使用Envers上的一个项目,该项目还使用的休眠和弹-我理解很多代码减少提供的HibernateTemplate.

我配置的Envers下访问用户,并经过一些调整,我能够有架构产生的EnversHibernateToolTask蚂蚁的任务(包括审计表)。然而,当我写的代码如:

    hibernateTemplate.saveOrUpdate(f);

数据是持久的,但没有进入的审计表。相反,如果我写的:

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

然后数据时候的审计表(但是我宁愿采用前法-我知道使用访问用户的分离。这些代码从休眠状态,但就简单的未付清的麻烦变化的奥姆引擎是不是在我的最疯狂的梦想为这个项目。)

它可能有助于检查我的 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有其访问用户的对应物, JpaTemplate 它提供了一个相当类似的功能。

因Envers不起作用HibernateTemplate是因为它依赖于访问用户的事件(你可以看到的听众宣告你的 persistence.xml 以上)时触发的。是使用。这有可能在理论,以编写代码,触发这些事件从休眠届会议时HibernateTemplate用,但它不参与。

其他提示

所有的u需要做的就是把@事务在你的道或服务电话的道.save()/更新方法。

甚至如果您注册eventlistener这些事件都没有被解雇,除非你使用业的弹簧固.春天已经知道,告诉休眠,这些事件被解雇。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top