3
respostas

Como lidar com transação utilizando o CDI?

Gostaria de saber como lidar com transações no CDI? Visto que no EJB as transações são gerenciadas automaticamente para nós, o CDI tem algum mecanismo parecido? Ou devemos configurar manualmente com as anotações do JTA?

3 respostas

Você pode usar um Interceptor para isso, por exemplo:

1 - Criar uma classe que gerencie a transação:

@Transacional
@Interceptor
public class GerenciadorDeTransacao implements Serializable {

    private static final long serialVersionUID = 1L;

    @Inject
    EntityManager em;

    @AroundInvoke
    public Object executarTransacao(InvocationContext context) throws Exception{

        em.getTransaction().begin();

        Object resultado = context.proceed();

        em.getTransaction().commit();

        return resultado;

    }

}

2- Criar a anotação que ligará a classe:

@InterceptorBinding
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Transacional {


}

3 - Utilizar a anotação nos métodos que vão utilizar transação, chamando assim o nosso interceptor:

@Transacional
    public void remover(Objeto objeto){
        dao.remove(objeto);

    }

Essa forma é abordado no curso de JSF com CDI.

Queria saber como fazer com uma abordagem mais parecida com o EJB, ouvi dizer que o CDI já suporta as anotações de JTA para tratar as transações automaticamente como o EJB faz, as CMT (Container-managed transaction).

Acredito que a CDI não tenha esse controle, mas você pode usar a especificação JTA com o @transaction para utilizar CMT. Nunca trabalhei com o CDI gerenciando transações em um cenário real, então acho que alguém com mais conhecimento em CDI possa esclarecer melhor :)