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.
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
Erweitern Sie einfach das Beispiel mit meiner aktuellen Konfiguration. Entschuldigung für die späte Antwort! –