Frage

Ich bin versucht, Envers auf ein Projekt, das auch verwendet Hibernate und Spring - und ich Schätze eine Menge der code-Reduzierung angeboten von HibernateTemplate.

Ich konfigurierte Envers unter JPA, und nach ein paar Anpassungen konnte ich der schema-erstellt durch die EnversHibernateToolTask Ant-task (einschließlich der Audit-Tabellen).Wenn ich jedoch code schreiben wie:

    hibernateTemplate.saveOrUpdate(f);

der Daten wird beibehalten, aber nichts geht in die Audit-Tabellen.Umgekehrt, wenn ich Schreibe:

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

dann gehst Daten an die audit-Tabellen (aber ich würde lieber die ehemaligen syntax - ich weiß, using JPA ' s EntityManager entkoppelt, dass code aus dem Ruhezustand, aber es einfach nicht lohnt die Mühe wechselnden ORM-engine ist nicht in meinen wildesten träumen für dieses Projekt.)

Es kann helfen zu überprüfen meine applicationContext.xml Konfiguration:

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

und hier ist mein persistence.xml setup:

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

Hat jemand einen Tipp geben, was ist hier Los?Danke!!!

War es hilfreich?

Lösung

HibernateTemplate hat seine JPA Pendant JpaTemplate die bietet eine ziemlich ähnliche Funktionen.

Der Grund Envers funktioniert nicht mit HibernateTemplate ist, weil Sie sich auf der PPV-Ereignisse (Sie können sehen die Zuhörer erklärt in Ihrem persistence.xml oben) ausgelöst, wenn EntityManager verwendet wird.Es ist theoretisch möglich, code zu schreiben, um die trigger-Ereignisse von Hibernate-session bei der HibernateTemplate verwendet wird, aber es ist ziemlich involviert.

Andere Tipps

Alle u tun musste, war legen Sie @Transactional in der Dao oder Dienstleistungen, rufen Sie die dao.save()/ update-Methoden.

Auch wenn Sie sich Ihre eventlistener diese Ereignisse werden nicht ausgelöst, es sei denn, Sie verwenden transcational der Frühling FW.Der Frühling hat die wissen und sagen, hibernate, dass diese Ereignisse ausgelöst werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top