Spring 2.0.6 + Hibernate 3.2.6 + Geronimo transaction manage
adepue Sep 22, 2008 6:12 PMI'm experimenting using Envers with Spring + Hibernate (using the versions of Spring and Hibernate we currently use in production here), and have an issue. At transaction commit time, this exception is thrown:
org.hibernate.SessionException: Session is closed! at org.hibernate.impl.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:49) at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:531) at org.hibernate.impl.SessionImpl.save(SessionImpl.java:523) at org.jboss.envers.revisioninfo.DefaultRevisionInfoGenerator.generate(DefaultRevisionInfoGenerator.java:81) at org.jboss.envers.synchronization.VersionsSync.executeInSession(VersionsSync.java:109) at org.jboss.envers.synchronization.VersionsSync.beforeCompletion(VersionsSync.java:145) at org.apache.geronimo.transaction.manager.TransactionImpl.beforeCompletion(TransactionImpl.java:514) at org.apache.geronimo.transaction.manager.TransactionImpl.beforeCompletion(TransactionImpl.java:498) at org.apache.geronimo.transaction.manager.TransactionImpl.beforePrepare(TransactionImpl.java:400) at org.apache.geronimo.transaction.manager.TransactionImpl.commit(TransactionImpl.java:257) at org.apache.geronimo.transaction.manager.TransactionManagerImpl.commit(TransactionManagerImpl.java:238) at org.springframework.transaction.jta.JtaTransactionManager.doCommit(JtaTransactionManager.java:842) at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:662) at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:632) at org.jencks.GeronimoPlatformTransactionManager.commit(GeronimoPlatformTransactionManager.java:76) at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:139) ...
It appears that Spring's org.springframework.orm.hibernate3.SpringSessionSynchronization closes the session in its own beforeCompletion() method, which is invoked before Envers' beforeCompletion().
Is this a bug, or just misconfiguration? And if it is a bug, any ideas on a workaround? I wonder if org.jboss.envers.synchronization.VersionsSync.beforeCompletion() could be modified to detect this case and use a new session, or even a temporary session like what is done for manual flush mode?