Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Estou com dúvida no curso de JPA 2: Introdução à persistência de dados com JPA e Hibernate, no exercício do capítulo Relacionamentos bidirecionais e o comportamento LAZY.

Não consegui entender o execício 10 do capítulo 6, poderia me explicar até fiz a configuração lançou a exceção: Exception in thread "main" org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: br.com.caelum.financas.modelo.Conta.movimentacoes, could not initialize proxy - no Session, mais não entendi como resolver com uma query pode por gentileza me explicar melhor, sds!

3 respostas
solução!

Ola, ele lanca esta excecao porque as movimentacoes de uma conta sao recuperadas de forma LAZY (isto é somente quando voce chama o metodo getMovimentacoes é feito o select) e voce esta tentando acessar as movimentacoes com conta.getMovimentacoes().size() usando um EntityManager que foi fechado. Ou seja, por ser LAZY voce iria fazer um select em um EM que foi fechado.

Para resolver isso a ideia é fazer o select previamente quando voce recupera a conta atraves do join fecth. Ficando

Query query = manager.createQuery("select c from Conta c join fetch c.movimentacoes where c.id = :pId");

Bons estudos

Complementando. Quando você coloca o join fetch das movimentacoes, voce esta obrigando que todas as movimentacões sejam carregas na conta. E com as movimentacoes instanciadas na conta o erro nao ocorre mais quando a sessao é fechada, pois o hibernate nao precisa mais consultar o banco.

Obrigado pela explicação, abç!