Pergunta

Eu estou tentando usar Envers em um projeto que também usa Hibernate e Spring -. E eu aprecio muito a redução de código oferecida pelo HibernateTemplate

Eu configurei Envers sob JPA, e depois de alguns ajustes que eu era capaz de ter o esquema gerado pela tarefa EnversHibernateToolTask ??Ant (incluindo as tabelas de auditoria). No entanto, quando eu escrever código como:

    hibernateTemplate.saveOrUpdate(f);

os dados é mantido, mas nada vai para as mesas de auditoria. Por outro lado, se eu escrever:

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

, em seguida, os dados entrando para as tabelas de auditoria (mas eu prefiro usar o antigo sintaxe - Eu sei que usando EntityManager do JPA desacopla que o código do Hibernate, mas simples não pagar o aborrecimento - mudando motor ORM não está no meu mais selvagem sonha para este projeto.)

Pode ajudar a verificar a configuração do meu 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>

e aqui está a minha configuração 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>

Alguém tem uma dica sobre o que está acontecendo aqui? Obrigado!

Foi útil?

Solução

HibernateTemplate tem a sua contrapartida JPA, JpaTemplate que fornece uma funcionalidade bastante similar.

A razão Envers não funciona com HibernateTemplate é porque ele depende de eventos da APP (você pode ver os ouvintes declarou em sua persistence.xml acima) acionada quando EntityManager é usada. É possível, em teoria, para escrever código para acionar esses eventos de sessão do Hibernate quando HibernateTemplate é usado, mas é bastante envolvida.

Outras dicas

Todos os u precisava fazer era colocar @Transactional em sua Dao ou serviços que exigem o dao.save () / métodos de atualização.

Mesmo se você registrar seu eventlistener esses eventos não são disparados a menos que você use transcational do FW Primavera. Primavera tem que saber e dizer hibernate que esses eventos são disparados.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top