Controle de transacao e sempre um ponto critico em qualquer aplicacao. Iniciar, tratar falhas e finalizar transacoes manualmente pode ser muito complicado, portanto muitas vezes usamos algum framework ou pratica ja consolidada para abordar o problema.Em aplicacoes web uma abordagem muito utilizada e "uma transacao por requisicao", que consiste em abrir uma transacao a cada requisicao feita e no fim da logica da requisicao podemos efetuar o commit caso tudo tenha acontecido como esperado ou efetuar um rollback.Note que voce pode fazer isso em todos os seus servlets ou metodos dos controllers do seu framework mvc, mas dessa forma a tarefa sera repetitiva e de dificil manutencao. Para melhorarmos o cenario, caso esteja trabalhando com uma aplicacao usando uma api mais baixa como Servlets e possivel usar um filter para implementar essa funcionalidade.Com o Vraptor temos essa funcionalidade pronta, veja a documentacao e o codigo. Se seguirmos a apostila oficial veremos que neste caso o Vraptor gerencia a SessionFactory, a Session e tambem nossos DAOs.A motivacao deste post foi um cenario encontrado em um projeto onde ja possuiamos tudo gerenciado pelo Spring, inclusive transacoes e DAOs, nao gostariamos de refatorar tudo e ainda assim tirar proveito da abordagem de uma transacao por requisicao. Para quem quiser acompanhar como chegamos a solucao segue o link do post no guj: http://www.guj.com.br/java/224207-vraptor3--hibernate--transactional-na-controller/4Vamos ao codigo: true true org.hibernate.dialect.MySQLDialect update true Este e o applicationContex.xml usado na aplicacao, apenas declaramos o dataSource, nossa sessionFactory e tambem um transactionManager. Nada diferente de qualquer aplicacao Spring normal.Criamos um DAO generico:public abstract class GenericDAOHibernate<T> { protected SessionFactory sessionFactory; private final Class<T> persistentClass; @Autowired public GenericDAOHibernate(SessionFactory sessionFactory) { this.persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()) .getActualTypeArguments()[0]; this.sessionFactory = sessionFactory; } public T load(Long id) { return (T) this.getSession().get(this.persistentClass, id); } // outros metodos...}Uma implementacao do nosso DAO @Repositorypublic class UserDAOHibernate extends GenericDAOHibernate { @Autowired public UserDAOHibernate(SessionFactory sessionFactory) { super(sessionFactory); } @Override public User getUserByLogin(String login) { //... } // outros metodos...}E por fim o nosso interceptador de transacoes:@Interceptspublic class SpringTransactionInterceptor implements Interceptor { private PlatformTransactionManager transactionManager; private final Validator validator; public TransactionInterceptor(PlatformTransactionManager transactionManager, Validator validator) { this.transactionManager = transactionManager; this.validator = validator; } @Override public void intercept(InterceptorStack stack, ResourceMethod method, Object resourceInstance) throws InterceptionException { TransactionDefinition def = new DefaultTransactionDefinition(); TransactionStatus status = transactionManager.getTransaction(def); try { stack.next(method, resourceInstance); if (!validator.hasErrors()) { transactionManager.commit(status); } } finally { if (!status.isCompleted()) { transactionManager.rollback(status); } } } @Override public boolean accepts(ResourceMethod method) { return true; }}Note que voce pode tanto neste interceptor, quanto no padrao do Vraptor, sobreescrever os comportamentos. Um exemplo seria interceptar apenas metodos anotados com uma anotacao propria.Voce pode baixar esta classe na forma de plugin no Github de contribuicoes do Vraptor ou no meu particular. Caso tenha alguma duvida e so entrar em contato. Como sabemos, testar garante que nosso codigo tenha mais qualidade, seja mais conciso e elegante e tambem conhecemos a importancia de testar nossas aplicacoes. Porem testar gera mais codigo e devemos dar ao codigo de teste a mesma atencao que damos ao codigo de producao, para que os testes sejam faceis de entender e nao se tornem dificeis de