Como controlar transação com CDI

Ambiente:

  • GlassFish server 4.1.1
  • NetBeans 8.2
  • JSF
  • Primefaces

Estou tentando tentando usar o seguinte método:

public Usuario merge(Usuario usuario) {
    return em.merge(usuario);
}

Entretanto, há a acusação de que não existe uma transação ativa (que eu acredito que deveria ser gerenciada pelo servidor) então, tentei isso:

public Usuario merge(Usuario usuario) {
    em.getTransaction().begin();
    Usuario u = em.merge(usuario);
    em.getTransaction().commit();
    return u;
}

Então, a acusação passou a ser de que a transação deveria feita usando JTA, e mais uma vez tentei abordar assim:

    @PersistenceContext
    private EntityManager em;
    @Resource
    private UserTransaction transaction;

    public Usuario merge(Usuario usuario) {
        try {
            transaction.begin();
            Usuario t = em.merge(usuario);
            transaction.commit();
            return t;
        } catch (Exception ex) {
            System.out.println(ex);
            return null;
        }
    }

Mas como devem imaginar também não deu certo e agora estou recebendo uma

javax.validation.ConstraintViolationException:

Qual é a abordagem que eu deveria usar para que o servidor controle a transação utilizando CDI?

Eu tive esse problema quando utilizei o Hibernate com o Glassfish.

A solução que encontrei foi a substituição o logging do jboss contindo dentro do glassfish por esse versão :

jboss-logging-3.3.0.Final.jar

a pois isso no meu persistence.xml adicionei o seguinte trecho :

<property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.SunOneJtaPlatform"/>  

no meu caso utilizei o Hibernate OGM

Sei que é meio antigo esse post, mas acho que posso ajudar. Eu concordo com o usuário @Daniel_Dias, e quero fazer um complemento ao que ele escreveu. Você pode além de substituir a api de logging do Glassfish, por essa que ele citou, ou por outra api de logging que não cause conflito. Mas faça um print do retorno do sql gerado no merge, para saber o que está dando conflito, por que está sendo lançada a exceção ConstraintViolationException ? Se existe uma violação de chave estrangeira.

Eu fiz um tópico sobre como utilizar o controle explícito de transações JTA por BMT (Bean Managed Transactions), utiliza o objeto UserTransacition. Por favor, veja se ajuda ?
Segue o link: http://www.tidicas.com.br/?p=319