문제

최대 절전 모드와 스프링을 사용하는 프로젝트에서 Envers를 사용하려고 노력하고 있습니다. HibernateTemplate에서 제공하는 코드 축소에 감사드립니다.

JPA에서 Envers를 구성했으며 몇 번의 조정 후 EnverShibernateLtask ant 작업 (감사 테이블 포함)에 의해 스키마를 생성 할 수있었습니다. 그러나 다음과 같은 코드를 작성할 때

    hibernateTemplate.saveOrUpdate(f);

데이터는 지속되지만 감사 테이블에는 아무것도 없습니다. 반대로, 내가 쓰면 :

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

그런 다음 감사 테이블에 대한 데이터가 가장 중요합니다 (그러나 이전 구문을 사용하고 싶습니다. JPA의 EntityManager Decouples를 사용하여 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>

여기서 무슨 일이 일어나고 있는지에 대한 힌트가 있습니까? 고맙습니다!

도움이 되었습니까?

해결책

HibernateTemplate에는 JPA 상대방이 있습니다. JPATEMPLATE 상당히 유사한 기능을 제공합니다.

Envers가 HibernateTemplate에서 작동하지 않는 이유는 JPA 이벤트에 의존하기 때문입니다 (청취자가 귀하의 선언 된 청취자를 볼 수 있습니다. persistence.xml 위)는 EntityManager를 사용할 때 트리거됩니다. 이론적으로 HibernateTemplate이 사용될 때 최대 절전 모드 세션에서 해당 이벤트를 트리거하기 위해 코드를 작성할 수는 있지만 다소 관여합니다.

다른 팁

당신의 dao 또는 dao.save ()/ 업데이트 메소드를 호출하는 서비스에 @transactional을 넣는 것입니다.

eventlistener를 등록하더라도 Spring FW의 Transcational을 사용하지 않는 한 이러한 이벤트는 해고되지 않습니다. Spring은 이러한 사건이 해고되었음을 최대 절전 모드를 알고 말해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top