In our app, we are trying to use the OPTIMISTIC_FORCE_INCREMENT lock inside a JTA transaction. When committing it, we got an exception(below) complaining that the session is already closed when it tries to increment the version.
I can reproduce this behavior with a simple test app (one session bean deployed in JBoss 5 loading an entity and setting the lock).
Is such a lock supported by Spring ?
Code:public DocumentOwner doInHibernate(Session session) throws HibernateException, SQLException { Criteria criteria = session.createCriteria(DocumentOwner.class).add(Restrictions.eq("sid", sid)); criteria.setLockMode(LockMode.OPTIMISTIC_FORCE_INCREMENT); return (DocumentOwner)criteria.uniqueResult(); } @Stateless @Remote(DocumentOwnerRemote.class) @Transactional @Interceptors(SpringBeanAutowiringInterceptor.class) @Resource(name="jdbc/SeXADataSource", mappedName="java:/jdbc/SeXADataSource") public class DocumentOwnerSessionBean implements DocumentOwnerRemote { @Autowired private DocumentOwnerDAO dao; public DocumentOwner getDocumentOwner(Long sid) { return dao.loadDocumentOwner(sid); } } <tx:annotation-driven /> <tx:jta-transaction-manager /> <jee:jndi-lookup id="dataSource" jndi-name="jdbc/SeXADataSource" resource-ref="true"> <jee:environment> java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory java.naming.provider.url=jnp://localhost:1099 java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces </jee:environment> </jee:jndi-lookup> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <!-- Must references all OR mapping files. --> <property name="configLocation" value="classpath:hibernate.cfg.xml" /> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory </prop> <prop key="hibernate.current_session_context_class">jta</prop> <prop key="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.JBossTransactionManagerLookup </prop> </props> </property> </bean>
Caused by: org.hibernate.SessionException: Session is closed!
at org.hibernate.impl.AbstractSessionImpl.errorIfClos ed(AbstractSessionImpl.java:72)
at org.hibernate.impl.SessionImpl.getBatcher(SessionI mpl.java:305)
at org.hibernate.persister.entity.AbstractEntityPersi ster.forceVersionIncrement(AbstractEntityPersister .java:1332)
at org.hibernate.action.EntityIncrementVersionProcess .doBeforeTransactionCompletion(EntityIncrementVers ionProcess.java:51)
at org.hibernate.engine.ActionQueue$BeforeTransaction CompletionProcessQueue.beforeTransactionCompletion (ActionQueue.java:543)
at org.hibernate.engine.ActionQueue.beforeTransaction Completion(ActionQueue.java:216)
at org.hibernate.impl.SessionImpl.beforeTransactionCo mpletion(SessionImpl.java:571)
at org.hibernate.jdbc.JDBCContext.beforeTransactionCo mpletion(JDBCContext.java:250)
at org.hibernate.transaction.synchronization.Callback Coordinator.beforeCompletion(CallbackCoordinator.j ava:125)
at org.hibernate.transaction.synchronization.Hibernat eSynchronizationImpl.beforeCompletion(HibernateSyn chronizationImpl.java:51)
at com.arjuna.ats.internal.jta.resources.arjunacore.S ynchronizationImple.beforeCompletion(Synchronizati onImple.java:101)
at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordina tor.beforeCompletion(TwoPhaseCoordinator.java:269)
at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordina tor.end(TwoPhaseCoordinator.java:89)
at com.arjuna.ats.arjuna.AtomicAction.commit(AtomicAc tion.java:177)
at com.arjuna.ats.internal.jta.transaction.arjunacore .TransactionImple.commitAndDisassociate(Transactio nImple.java:1423)
at com.arjuna.ats.internal.jta.transaction.arjunacore .BaseTransaction.commit(BaseTransaction.java:137)
at com.arjuna.ats.jbossatx.BaseTransactionManagerDele gate.commit(BaseTransactionManagerDelegate.java:75 )
at org.jboss.aspects.tx.TxPolicy.endTransaction(TxPol icy.java:170)
at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPoli cy.java:87)
at org.jboss.aspects.tx.TxInterceptor$Required.invoke (TxInterceptor.java:190)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNex t(MethodInvocation.java:102)
at org.jboss.aspects.tx.TxPropagationInterceptor.invo ke(TxPropagationInterceptor.java:76)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNex t(MethodInvocation.java:102)
at org.jboss.ejb3.tx.NullInterceptor.invoke(NullInter ceptor.java:42)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNex t(MethodInvocation.java:102)
at org.jboss.ejb3.security.RoleBasedAuthorizationInte rceptorv2.invoke(RoleBasedAuthorizationInterceptor v2.java:201)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNex t(MethodInvocation.java:102)
at org.jboss.ejb3.security.Ejb3AuthenticationIntercep torv2.invoke(Ejb3AuthenticationInterceptorv2.java: 186)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNex t(MethodInvocation.java:102)
at org.jboss.ejb3.ENCPropagationInterceptor.invoke(EN CPropagationInterceptor.java:41)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNex t(MethodInvocation.java:102)
at org.jboss.ejb3.BlockContainerShutdownInterceptor.i nvoke(BlockContainerShutdownInterceptor.java:67)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNex t(MethodInvocation.java:102)
at org.jboss.aspects.currentinvocation.CurrentInvocat ionInterceptor.invoke(CurrentInvocationInterceptor .java:67)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNex t(MethodInvocation.java:102)
at org.jboss.ejb3.stateless.StatelessContainer.dynami cInvoke(StatelessContainer.java:421)
at org.jboss.ejb3.session.InvokableContextClassProxyH ack._dynamicInvoke(InvokableContextClassProxyHack. java:53)
at org.jboss.aop.Dispatcher.invoke(Dispatcher.java:91 )
at org.jboss.aspects.remoting.AOPRemotingInvocationHa ndler.invoke(AOPRemotingInvocationHandler.java:82)
at org.jboss.remoting.ServerInvoker.invoke(ServerInvo ker.java:891)
at org.jboss.remoting.transport.socket.ServerThread.c ompleteInvocation(ServerThread.java:744)
at org.jboss.remoting.transport.socket.ServerThread.p rocessInvocation(ServerThread.java:697)
at org.jboss.remoting.transport.socket.ServerThread.d orun(ServerThread.java:524)
at org.jboss.remoting.transport.socket.ServerThread.r un(ServerThread.java:232)


Reply With Quote