Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

entityManager.find não funciona com Lazy Loading no WildFly

Olá! Tudo bem?

Este tópico já estava aberto em https://cursos.alura.com.br/forum/topico-tempo-de-duracao-de-uma-transacao-no-wildfly-128154#872647

Mas coloquei-o aqui novamente, com algumas mudanças, pra facilitar a identificação.

Fiz a seguinte alteração no projeto do curso:

Na classe AgendamentoEmail, acrescentei um atributo de uma entidade de teste que criei e o anotei com Lazy Loading, da seguinte forma:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "entidade_teste_id")
private EntidadeTeste entidadeTeste;

No DAO, acrescentei um método getPorId, da seguinte forma:

    public AgendamentoEmail getPorId(Long id) {
        AgendamentoEmail agendamentoEmail = entityManager.find(AgendamentoEmail.class, id);
        System.out.println("Descrição da entidade teste: " + agendamentoEmail.getEntidadeTeste().getDescricao());
        return agendamentoEmail; 
    }

Perceba que estou utilizando o mesmo código do projeto, e que em teoria eu deveria estar na mesma transação, e por isso o código acima deveria executar normalmente, sem erros (levando-se em consideração que existe o campo com o ID referenciado).

Porém, ao executar esse método, o seguinte erro aparece:

Caused by: org.hibernate.TransientObjectException: Proxy [br.com.alura.entidade.EntidadeTeste#1] is detached (i.e, session is null). The read-only/modifiable setting is only accessible when the proxy is associated with an open session.

E o curioso é que esse código funciona normalmente em um projeto Hibernate com CDI e rodando no Tomcat.

Gostaria de saber mais sobre esse comportamento, e como eu posso fazer para aproveitar o benefício de o Hibernate recuperar campos anotados como Lazy enquanto ainda estiver na mesma transação (sem anotar o atributo como eager, e sem acrescentar um join fetch pra ele trazer tudo de uma vez).

Em outras palavras, se funciona normalmente no tomcat, como eu poderia fazer para funcionar também no wildfly?

1 resposta
solução!

Consegui resolver configurando o infinispan no persistence.xml. Mas ainda restam dúvidas, principalmente no que diz respeito ao que causou o problema e ao aperfeiçoamento da solução.

Vou continuar no tópico inicialmente criado, para que as informações fiquem mais centralizadas.

Apenas para facilitar, segue o link: https://cursos.alura.com.br/forum/topico-tempo-de-duracao-de-uma-transacao-no-wildfly-128154

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software