2

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?

daole
  • 183
  • 10

1 Answers1

0

Very old unanswered question but here what could be an answer: You must rollback your transaction but you have no need to close the session. Unless you really want to.

There are tools such annotations that prevent you from using this in your code, but this would be more like this:

        tx.commit();
    } catch (HibernateException e) {
        tx.rollback();
        logger.error(e);
    } 
lekant
  • 992
  • 9
  • 14