2016-08-09 82 views
3

Ich habe versucht, den ganzen Tag den Kopf um dieses Problem zu wickeln.Hibernate Envers nicht finden JPA-Transaktion:

Derzeit hat unser Projekt den JPATransactionManager über einen Spring Application Context eingerichtet, um unsere verschiedenen Session-Transaktionen unter Verwendung von @Transactional für alle Dienste zu erledigen, die sich um Persistence und Deletionen kümmern (DAO-Nutzung).

Bei der Umstellung von Hibernate 3 auf 5 wollten wir die Verwendung eines benutzerdefinierten Audit-Interceptors entfernen und die Verwendung von Hibernate Envers aktivieren. Ich habe alle richtig meine Klassen mit Anmerkungen versehen und haben die Tabellen erstellt werden, aber sobald es wird tatsächlich zu einem Punkt der Insertion, wirft der Hörer einen Fehler, bei dem es nicht die aktuelle Transaktion durch JPA gegeben finden:

 
org.hibernate.envers.exception.AuditException: Unable to create revision because of non-active transaction 
    at org.hibernate.envers.event.spi.BaseEnversEventListener.checkIfTransactionInProgress(BaseEnversEventListener.java:132) 
    at org.hibernate.envers.event.spi.EnversPostInsertEventListenerImpl.onPostInsert(EnversPostInsertEventListenerImpl.java:34) 
    at org.hibernate.action.internal.EntityIdentityInsertAction.postInsert(EntityIdentityInsertAction.java:156) 
    at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:102) 
    at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:597) 
    at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:232) 
    at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:213) 
    at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:256) 
    at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:318) 
    at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:275) 
    at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:182) 
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:113) 
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:192) 
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:177) 
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:97) 
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:73) 
    at org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:651) 
    at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:643) 
    at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:638) 

Wenn Sie in den Code schauen, scheint es, dass es den Transaktionsstatus von seinem Standardwert INACTIVE abhebt, was bedeutet, dass es sich nicht korrekt in die Transaktion einklinkt. Ich weiß, dass Hibernate Envers die Listener automatisch mit den neuesten Versionen in den Ruhezustand versetzt, so dass ich nicht weiß, ob dies auch eine Ursache des Problems sein könnte.

Ich weiß, dass es dokumentiert wurde, um mit HibernateTransactionManager zu arbeiten, aber wir wollen von der Verwendung für unsere Transaktionen und Sitzungen ausschließlich über Spring erleichtern die Dinge erleichtern, so dass es auch die Notwendigkeit der Suche nach einer Alternative zu sein envers. Hat jemand einen Rat oder eine Lösung für dieses Problem? Oder auch dieses Problem?

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= 

Mein DAOs sind so angeschlossen, die txProxyTemplate mit wie

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

mein All s Dienste, die die verschiedenen DAOs verwenden, werden einfach über die Annotation @Transactional verbunden, in der Transaktionen stattfinden sollen. Ich war in der Lage, durch Trace zu sehen, dass meine Transaktionen erfolgreich abschließen und bei Fehlern zurückrollen. Sobald ich Enver in den Mix eingefügt habe, kann das Auditing die Transaktion nicht finden, der ich beitreten möchte. Da muss etwas fehlen, aber ich bin mir nicht sicher, was es ist.

+0

Können Sie Ihren Post mit Ihrer Spring-Konfiguration für EntityManagerFactoryBean, TransactionManager und so weiter aktualisieren? Ich habe keine Probleme mit Envers in einer vollständig konfigurierten Federumgebung. – Naros

+0

Erweitern Sie einfach das Beispiel mit meiner aktuellen Konfiguration. Entschuldigung für die späte Antwort! –

Antwort

0

Ich glaube nicht, dass Sie eine txProxyTemplate Bohne noch eine SpringTransactionPolicy aus meiner Erfahrung definieren müssen. Diese Funktionalität wurde seither durch die <tx:/> Tags und die Verwendung der @Transactional Annotation ersetzt.

Sie müssen nur sicherstellen, dass ein JpaTransactionManager erstellt und zugeordnet wurde als transactionManager mit dem <tx:annotation-driven/> Tag verbunden.