Never mix Spring transactional aop:advice and TransactionProxy
...just don't do it. I used to work with TransactionProxyFactoryBean quite a lot, back then when Spring 1.x was out and it worked quite nicely - especially when dealing with HibernateInterceptor as a preInterceptor it was quite useful. So imagine my surprise when I tried to mix out the new, shiny Spring 2.0 <aop:advice> anotation based @Transactional support: All session management code stopped working.
Yes, I should have known better. No, I didn't think of this immediately. Yes I did waste a lot of time with this. No, you may not slap me across the face with a Spring manual, I RTFS...by now.
What happens if you mix the two is this: The AOP Advice will open a Hibernate session for the method you are currently doing work in, then you invoke your DAO code which is wired up with your old TransactionProxyFactoryBean and the HibernateInterceptor. HibernateInterceptor will say: "Alright, this isn't so bad, there is already an open session." and pass the steering wheel back to your DAO. When the DAO is finished, HibernateInterceptor is called again and closes whatever session it finds...which happens to be...the ONLY session you have. All further code that involves accessing your pojos will fail, from this point on.
Note to self: Read the docs more carefully.