Pregunta

Estoy tratando de usar Envers en un proyecto que también usa Hibernate y Spring, y aprecio mucho la reducción de código que ofrece HibernateTemplate.

Configuré Envers bajo JPA, y después de algunos ajustes pude tener el esquema generado por la tarea Ant de EnversHibernateToolTask ??(incluidas las tablas de auditoría). Sin embargo, cuando escribo código como:

    hibernateTemplate.saveOrUpdate(f);

los datos son persistentes, pero nada va a las tablas de auditoría. Por el contrario, si escribo:

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

luego los datos van a las tablas de auditoría (pero prefiero usar la sintaxis anterior; sé que usar EntityManager de JPA desacopla ese código de Hibernate, pero simplemente no compensa la molestia: cambiar el motor ORM no está en mi peor momento sueños para este proyecto.)

Puede ser útil verificar mi configuración de 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>

y aquí está mi configuración 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>

¿Alguien tiene una pista de lo que está pasando aquí? ¡Gracias!

¿Fue útil?

Solución

HibernateTemplate tiene su contraparte JPA, JpaTemplate que proporciona una funcionalidad bastante similar.

La razón por la que Envers no funciona con HibernateTemplate es porque se basa en eventos JPA (puede ver los oyentes declarados en su persistence.xml arriba) activados cuando se utiliza EntityManager. En teoría, es posible escribir código para activar esos eventos desde la sesión de Hibernate cuando se usa HibernateTemplate, pero es bastante complicado.

Otros consejos

Todo lo que tenía que hacer era poner @Transactional en su Dao o servicios que llamaran a los métodos dao.save () / update.

Incluso si registra su escucha de eventos, estos eventos no se activan a menos que use transcational del Spring FW. Spring tiene que saber y decirle a Hibernate que estos eventos se disparan.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top