Normally, we use Spring + Atomikos to manage the JTA sessions and set hibernate.auto_close_session to true. Now, if we manually open a stateless session (for some async job) as:
StatelessSession sl = sessionFactory.openStatelessSession();
How do we close the StatelessSession? If we call
sl.close()
then the "currentSession" will rollback. If we annotate
@Transactional(propagation = Propagation.NOT_SUPPORTED)
on the method that use the StatelessSession, the commit hangs, the Atomikos log shows that it keep spawning new transactions and never stops.
Full code:
public Vendor findByCode(String code) {
StatelessSession slsession = null;
Transaction tx = null;
try {
slsession = getStatelessSession();
tx = slsession.beginTransaction();
return (Vendor) slsession.createQuery("from Vendor"
+ " where code = :code")
.setParameter("code", code)
.uniqueResult();
} catch (HibernateException e) {
e.printStackTrace();
return null;
} finally {
if (slsession != null && tx != null) {
tx.commit();
slsession.close();
}
}
}
There is already a Spring managed session, and this method was called.
Could you suggest what is wrong?