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?
ATÉ 50% OFF
TÁ ACABANDO!
0 dias
0 horas
0 min
0 seg
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?
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 :)