The javadoc for AbstractPollingMessageListenerContainer.setSession Transacted says:

Setting this flag to "true" will use a short local JMS transaction when running outside of a managed transaction, and a synchronized local JMS transaction in case of a managed transaction (other than an XA transaction) being present. The latter has the effect of a local JMS transaction being managed alongside the main transaction (which might be a native JDBC transaction), with the JMS transaction committing right after the main transaction.
That "latter" part sounds useful, exactly what I am looking for, but the description is somewhat brief.

How do I cause a managed transaction to be "present"? By setting the MessageListener's transactionManager to my HibernateTransactionManager? (This didn't work in my tests)