2

Hibernate と Spring も使用するプロジェクトで Envers を使用しようとしています。HibernateTemplate によって提供されるコード削減に感謝しています。

JPA で Envers を構成し、いくつかの調整を行った後、EnversHibernateToolTask​​ Ant タスク (監査テーブルを含む) によってスキーマを生成することができました。ただし、次のようなコードを書くと:

    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>

ここで何が起こっているのかについてのヒントはありますか?ありがとうございました!

4

2 に答える 2

2

HibernateTemplate には、かなり類似した機能を提供するJPA 対応のJpaTemplateがあります。

Envers が HibernateTemplate で機能しない理由はpersistence.xml、EntityManager の使用時にトリガーされる JPA イベント (上記で宣言されたリスナーを確認できます) に依存しているためです。理論的には、HibernateTemplate が使用されている場合に Hibernate セッションからこれらのイベントをトリガーするコードを作成することは可能ですが、かなり複雑です。

于 2009-10-30T05:20:04.243 に答える
1

あなたがする必要があったのは、dao.save()/update メソッドを呼び出す @Transactional を Dao またはサービスに配置することだけでした。

イベントリスナーを登録しても、Spring FW のトランスケーショナルを使用しない限り、これらのイベントは発生しません。Spring は、これらのイベントが発生したことを知り、休止状態に伝える必要があります。

于 2010-10-25T13:23:51.360 に答える