Pessoal, estou estudando Vraptor 3 e gostaria de gerenciar transações do EntityManager com um Interceptor, porém não estou conseguindo.
O meu código executa e entra no Interceptador, porém acho que ele cria uma instância de EntityManager para o Controlador e outra para o Interceptador, assim o commit do Interceptador não grava os dados gerados pelo Controlador no banco de dados.
Tanto é que se eu abrir e fechar as transações pelo Controlador, sem usar o Interceptador, funciona de boa…
Ai vai o código do que fiz para teste:
Classe do Controlador:
@Resource
public class Usuario {
private EntityManager em;
private UsuarioEntity usuarioEntity;
private Result result;
public Usuario(Result result, EntityManager em, UsuarioEntity usuarioEntity) {
this.em = em;
this.usuarioEntity = usuarioEntity;
this.result = result;
}
@Path("/teste")
@Transacional
public void hibernate() {
usuarioEntity.setNome("Salomão Neto");
em.persist(usuarioEntity);
}
Classe do Interceptador:
@Intercepts
public class TransacoesInterceptor implements Interceptor {
private EntityManager em;
public TransacoesInterceptor(EntityManager em) {
this.em = em;
}
@Override
public void intercept(InterceptorStack interceptorStack, ResourceMethod resourceMethod, Object o) throws InterceptionException {
try {
//iniciando transação
em.getTransaction().begin();
//continuando execução do método
interceptorStack.next(resourceMethod, o);
//finalizando transação
em.getTransaction().commit();
} finally {
//desfazendo alterações em caso de erro
if(em.getTransaction().isActive())
em.getTransaction().rollback();
}
}
@Override
public boolean accepts(ResourceMethod resourceMethod) {
return resourceMethod.containsAnnotation(Transacional.class); }
}