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?