/** * */ package com.googlecode.tawus.hibernate.internal.advices; import org.apache.tapestry5.ioc.Invocation; import org.apache.tapestry5.ioc.MethodAdvice; import org.hibernate.Session; import org.hibernate.Transaction; import com.googlecode.tawus.hibernate.services.HibernateSessionManager; public class RequiresNewTransactionAdvice implements MethodAdvice { private HibernateSessionManager sessionManager; private String factoryID; public RequiresNewTransactionAdvice(String factoryID, HibernateSessionManager sessionManager) { this.sessionManager = sessionManager; this.factoryID = factoryID; } @Override public void advise(Invocation invocation) { if(sessionManager.isWithinTransaction()){ Session oldSession = sessionManager.getSession(factoryID); Session newSession = sessionManager.createSession(factoryID); Transaction tx = null; try{ tx = newSession.beginTransaction(); invocation.proceed(); tx.commit(); }catch(Exception ex){ if(tx != null){ tx.rollback(); } throw new RuntimeException(ex); }finally { newSession.close(); sessionManager.setSession(factoryID, oldSession); } }else{ try{ sessionManager.begin(factoryID); invocation.proceed(); sessionManager.commit(factoryID); }catch(Exception ex){ sessionManager.rollback(factoryID); throw new RuntimeException(ex); } } } }