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?
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 :)