-
Notifications
You must be signed in to change notification settings - Fork 38.5k
Hibernate Envers listeners fail because EntityManager is closed too early when using JPA/JTA/Hibernate 5.2.8/Envers [SPR-15334] #19897
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
Juergen Hoeller commented Hibernate 5.2's |
Allan Jones commented That can be easily reproduced with MyApp.zip project. getSessionFactory().getSessionFactoryOptions().isJpaBootstrap()
``` returns true
```java
if ( discardOnClose || !isTransactionInProgress( false ) )
``` returns false
And the following part closes the session
```java
else {
//Otherwise, session auto-close will be enabled by shouldAutoCloseSession().
waitingForAutoClose = true;
closed = true;
} since it has closed=true |
Juergen Hoeller commented OK, so technically the However, it seems that Hibernate Envers relies on the user handle still being open at commit time. That's arguably a design flaw: Envers is an internal extension which should operate independently from the user-level state of the I suppose this worked against Hibernate up until 5.1 since the All in all, please report this to Hibernate itself as well: In JPA, 'open' vs 'closed' is just a user-level indication, with the session entirely able to participate in the transaction commit phase still... just falling over its own feet by validating |
Allan Jones commented I have created an issue in hibernate: -I also facing another issue with Infinispan and there was this reply:- -Probably this might be related to that as well.- Just replaced atomikos with Jboss Narayana and the same issue. They are not related |
Juergen Hoeller commented To the best of my understanding, this will indeed happen with any transaction manager. Also, it will not just happen with Spring but rather with any use of "application-managed" EntityManagers, i.e. with any application obtaining an EntityManager via Within an active transaction, |
Andrei Ivanov commented I see Hibernate released version 5.2.9 with HHH-11570 marked as fixed for it. |
Juergen Hoeller commented Marking it as invalid from Spring's side, assuming that our interaction remains correct and that the fix in Hibernate ORM 5.2.9 makes it work properly again. |
Allan Jones commented Thanks for the support. But that's still a hibernate issue and not a spring issue. |
Allan Jones opened SPR-15334 and commented
My environment:
Using spring with JPA + JTA and Hibernate 5.2.8.Final + Envers
The problem is that Springframework ORM (JPA subpackage) closes the entity manager too early (During ```java
triggerBeforeCompletion(status)
Exception in thread "main" org.springframework.transaction.UnexpectedRollbackException: JTA transaction unexpectedly rolled back (maybe due to a timeout); nested exception is javax.transaction.RollbackException: The transaction was set to rollback only
at org.springframework.transaction.jta.JtaTransactionManager.doCommit(JtaTransactionManager.java:1026)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:761)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:730)
at com.myapp.services.MyService.reproduceIssue(MyService.java:40)
at com.myapp.App.main(App.java:12)
Caused by: javax.transaction.RollbackException: The transaction was set to rollback only
at com.atomikos.icatch.jta.TransactionImp.rethrowAsJtaRollbackException(TransactionImp.java:66)
at com.atomikos.icatch.jta.TransactionImp.commit(TransactionImp.java:207)
at com.atomikos.icatch.jta.TransactionManagerImp.commit(TransactionManagerImp.java:433)
at com.atomikos.icatch.jta.J2eeUserTransaction.commit(J2eeUserTransaction.java:94)
at org.springframework.transaction.jta.JtaTransactionManager.doCommit(JtaTransactionManager.java:1023)
... 4 more
Caused by: java.lang.IllegalStateException: Session/EntityManager is closed
at org.hibernate.internal.AbstractSharedSessionContract.checkOpen(AbstractSharedSessionContract.java:332)
at org.hibernate.engine.spi.SharedSessionContractImplementor.checkOpen(SharedSessionContractImplementor.java:126)
at org.hibernate.internal.SessionImpl.guessEntityName(SessionImpl.java:2228)
at org.hibernate.envers.event.spi.BaseEnversEventListener.addCollectionChangeWorkUnit(BaseEnversEventListener.java:107)
at org.hibernate.envers.event.spi.BaseEnversEventListener.generateBidirectionalCollectionChangeWorkUnits(BaseEnversEventListener.java:76)
at org.hibernate.envers.event.spi.EnversPostInsertEventListenerImpl.onPostInsert(EnversPostInsertEventListenerImpl.java:49)
at org.hibernate.action.internal.EntityInsertAction.postInsert(EntityInsertAction.java:164)
at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:131)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:586)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:460)
at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:337)
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39)
at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1428)
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:484)
at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3190)
at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2404)
at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:467)
at org.hibernate.resource.transaction.backend.jta.internal.JtaTransactionCoordinatorImpl.beforeCompletion(JtaTransactionCoordinatorImpl.java:320)
at org.hibernate.resource.transaction.backend.jta.internal.synchronization.SynchronizationCallbackCoordinatorNonTrackingImpl.beforeCompletion(SynchronizationCallbackCoordinatorNonTrackingImpl.java:47)
at org.hibernate.resource.transaction.backend.jta.internal.synchronization.RegisteredSynchronization.beforeCompletion(RegisteredSynchronization.java:37)
at com.atomikos.icatch.jta.Sync2Sync.beforeCompletion(Sync2Sync.java:50)
at com.atomikos.icatch.imp.TransactionStateHandler.notifyBeforeCompletion(TransactionStateHandler.java:261)
at com.atomikos.icatch.imp.TransactionStateHandler.commit(TransactionStateHandler.java:236)
at com.atomikos.icatch.imp.CompositeTransactionImp.doCommit(CompositeTransactionImp.java:288)
at com.atomikos.icatch.imp.CompositeTransactionImp.commit(CompositeTransactionImp.java:337)
at com.atomikos.icatch.jta.TransactionImp.commit(TransactionImp.java:191)
... 7 more
In hibernate 4.x there's no problem because the EntityManager and hibernate Session are two different instances and closing the entity manager won't always close the hibernate session. In hibernate 5.2.x they are the same instance.
I created a small setup where I can reproduce the issue. Please find it attached.
Main class: ```java
com.myapp.App
Affects: 4.3.7
Attachments:
Issue Links:
The text was updated successfully, but these errors were encountered: