【问题标题】:Hibernate Envers not Finding JPA Transaction:Hibernate Envers 未找到 JPA 事务:
【发布时间】:2016-12-14 21:54:17
【问题描述】:

我整天都在努力解决这个问题。

目前,我们的项目已通过 Spring Application Context 设置 JPATransactionManager 来处理我们的各种会话事务,并在所有负责持久性和删除(DAO 使用)的服务上使用 @Transactional。

从 Hibernate 3 切换到 5,我们希望删除对自定义审计拦截器的使用并继续使用 Hibernate Envers。我已经正确地注释了我的所有类并创建了表,但是一旦它实际到达插入点,侦听器就会抛出一个错误,它无法找到 JPA 给出的当前事务:

org.hibernate.envers.exception.AuditException:由于非活动事务而无法创建修订 在 org.hibernate.envers.event.spi.BaseEnversEventListener.checkIfTransactionInProgress(BaseEnversEventListener.java:132) 在 org.hibernate.envers.event.spi.EnversPostInsertEventListenerImpl.onPostInsert(EnversPostInsertEventListenerImpl.java:34) 在 org.hibernate.action.internal.EntityIdentityInsertAction.postInsert(EntityIdentityInsertAction.java:156) 在 org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:102) 在 org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:597) 在 org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:232) 在 org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:213) 在 org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:256) 在 org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:318) 在 org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:275) 在 org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:182) 在 org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:113) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:192) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:177) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:97) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:73) 在 org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:651) 在 org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:643) 在 org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:638)

查看代码内部,它似乎将事务状态建立在默认值 INACTIVE 的基础上,这意味着它没有正确连接到事务中。我知道 Hibernate Envers 还会自动将侦听器推送到最新版本的休眠状态,所以我不知道这是否也是问题的根源。

我知道它已被记录为与 HibernateTransactionManager 一起使用,但我们希望不再使用它,而是仅通过 Spring 连接我们的事务和会话,使事情变得更容易,因此可能还需要寻找 envers 的替代方案.有没有人对这个问题有任何建议或解决方案?或者也遇到这个问题?

ApplicationContext.xml

<tx:annotation-driven transaction-manager="transactionManager" />

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="dataSource" ref=“dataSource" />
</bean>

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="net.sourceforge.jtds.jdbcx.JtdsDataSource" />
    <property name="url" value="jdbc:jtds:sqlserver://.." />
    <property name="username" value=“..." />
    <property name="password" value=“..." />
</bean>

<bean id="hibernateProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="location">
        <value>classpath:hibernate.properties</value>
    </property>
</bean>

<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
    <property name="configLocation">
        <value>classpath:hibernate.cfg.xml</value>
    </property>
    <property name="hibernateProperties">
        <ref bean="hibernateProperties" />
    </property>
</bean>

<bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="transactionManager">
        <ref bean="transactionManager" />
    </property>
    <property name="transactionAttributes">
        <props>
            <prop key="find*">PROPAGATION_SUPPORTS,readOnly
            </prop>
            <prop key="load*">PROPAGATION_SUPPORTS,readOnly
            </prop>
            <prop key="make*">PROPAGATION_REQUIRED</prop>
            <prop key="add*">PROPAGATION_REQUIRED</prop>
            <prop key="refresh">PROPAGATION_SUPPORTS</prop>
            <prop key="delete*">PROPAGATION_REQUIRED</prop>
            <prop key="*">PROPAGATION_SUPPORTS,readOnly
            </prop>
        </props>
    </property>
</bean>

<bean id="PROPAGATION_REQUIRED" class="org.apache.camel.spring.spi.SpringTransactionPolicy">
    <property name="transactionManager" ref="transactionManager" />
</bean>

hibernate.properties

#hibernate.hbm2ddl.auto=update
hibernate.show_sql=true

hibernate.connection.datasource=java\:comp/env/datasource
#hibernate.connection.provider_class=org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl
hibernate.connection.provider_class=org.hibernate.connection.DatasourceConnectionProvider

hibernate.cache.use_second_level_cache=true
hibernate.cache.use_query_cache=true
#hibernate.generate_statistics=true
hibernate.cache.use_structured_entries=true
hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory
hibernate.id.new_generator_mappings=false

hibernate.dialect=org.hibernate.dialect.SQLServer2008Dialect

hibernate.listeners.envers.autoRegister=false
org.hibernate.envers.track_entities_changed_in_revision=false
org.hibernate.envers.audit_table_prefix=AUD_
org.hibernate.envers.audit_table_suffix=

我的 DAO 像这样使用 txProxyTemplate 连接起来

<bean id="objectDAO" parent="txProxyTemplate">
    <property name="target">
        <bean
            class="path.to.objectDAOImpl">
            <property name="sessionFactory">
                <ref local="sessionFactory" />
            </property>
        </bean>
    </property>
</bean>

我所有使用各种 DAO 的服务都简单地使用 @Transactional 注释连接到我们想要进行交易的地方。我已经能够通过跟踪看到我的事务成功完成并在出现错误时回滚。一旦我将 envers 添加到组合中,审计就找不到要加入的事务。一定有什么我错过了,但我不确定它是什么。

【问题讨论】:

  • 你能用你的 EntityManagerFactoryBean、TransactionManager 等的 spring 配置更新你的帖子吗?在完全配置的 spring 环境中,我对 Envers 没有这样的问题。
  • 刚刚用我当前的配置扩展了这个例子。抱歉回复晚了!

标签: spring hibernate jpa transactions hibernate-envers


【解决方案1】:

根据我的经验,我认为您不需要定义 txProxyTemplate bean 或 SpringTransactionPolicy。此功能已被&lt;tx:/&gt; 标记和@Transactional 注释的使用所取代。

您只需确保已创建 JpaTransactionManager 并将其关联为与 &lt;tx:annotation-driven/&gt; 标记关联的 transactionManager

【讨论】:

    猜你喜欢
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-29
    • 2013-11-28
    • 2013-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多