spring - Hibernate Envers not Finding JPA Transaction: -


i've been trying wrap head around issue day.

currently our project has setup jpatransactionmanager through spring application context take care of our various session transactions use of @transactional on services take care of persistence , deletions (dao usage).

changing on hibernate 3 5, wanted remove our use of custom audit interceptor , move onto using hibernate envers. have annotated classes , have tables being created, once gets point of insertion, listener throws error in can't find current transaction given jpa:

 org.hibernate.envers.exception.auditexception: unable create revision because of non-active transaction     @ 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) 

looking inside code, seems it's basing transaction status off it's default value of inactive meaning it's not hooking transaction properly. know hibernate envers automatically pushes listeners hibernate recent versions don't know if may source of issue.

i know been documented work hibernatetransactionmanager wish step away using in favor of hooking our transactions , sessions solely via spring making things easier may need of finding alternative envers. have advice or solutions problem? or hit issue?

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= 

my daos hooked using txproxytemplate so

<bean id="objectdao" parent="txproxytemplate">     <property name="target">         <bean             class="path.to.objectdaoimpl">             <property name="sessionfactory">                 <ref local="sessionfactory" />             </property>         </bean>     </property> </bean> 

all services use various daos hooked using @transactional annotation want have transactions. i've been able see through trace transactions succeeding in completing , rolling when there errors. once added envers mix, auditing can't find transaction join. there must i'm missing i'm not sure is.

i don't believe need define txproxytemplate bean nor springtransactionpolicy experience. functionality has since been superseded <tx:/> tags , use of @transactional annotation.

you need make sure jpatransactionmanager has been created , associated transactionmanager associated <tx:annotation-driven/> tag.


Comments