If you are using Spring use Spring for the transaction management as well.
From the reference manual
Hibernate 3 has a feature called contextual sessions, wherein Hibernate itself manages one current Session per transaction. This is roughly equivalent to Spring's synchronization of one Hibernate
Session per transaction.
Spring's LocalSessionFactoryBean supports Hibernate's SessionFactory.getCurrentSession() method for any Spring transaction strategy, returning
the current Spring-managed transactional Session even with HibernateTransactionManager. Of course, the standard behavior of that method remains the return of the current Session associated
with the ongoing JTA transaction, if any. This behavior applies regardless of whether you are using Spring's JtaTransactionManager, EJB container managed transactions (CMTs), or JTA.
So in short add Spring transactional support
Also I would encourage you to take advantage of Spring's unified unchecked exception translation. This is as simple as adding a component scan (also means you don't have to manually configure the beans in XML) and a @Repository stereo type annotation to your DAO class.
For example add this to your config
Now you have your Repository class. Note this bean will automatically be created as long as it is in a package defined in your component scan.
We can take advantage of the same type of automatic bean creation for our Service
This is not the only way to do it but it ls the recommended way. If you let Spring manage the transactions as well I think your issue will go away.