6
respostas

Busca de preços dá erro de Lazy mesmo com join fetch na JSQL.

Estou seguindo de acordo com a aula e no ProdutoDao eu tenho:

public Produto find(Integer id) {
        return manager
                .createQuery("select distinct(p) from Produto p join fetch p.precos preco where p.id = :id", Produto.class)
                .setParameter("id", id).getSingleResult();

    }

no ProdutoController eu tenho:

@RequestMapping("/detalhe")
    public ModelAndView Detalhe(Integer id) {
        ModelAndView mav = new ModelAndView("produtos/detalhe");
        Produto prod = produtoDao.find(id);
        mav.addObject("produto", prod);

        return mav;
    }

e mesmo assim eu obtenho o seguinte erro:

mai 25, 2017 4:26:11 PM org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet [dispatcher] in context with path [/casadocodigo] threw exception [org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: br.com.casadocodigo.loja.models.Produto.precos, could not initialize proxy - no Session] with root cause
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: br.com.casadocodigo.loja.models.Produto.precos, could not initialize proxy - no Session
    at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:572)

o "join fetch" deveria trazer a List< Preco> por Eager Loading no lugar do proxy que o Lazy Loading gera e isso não está ocorrendo. Alguém poderia me ajudar.

6 respostas

Estou com o mesmo problema.....

Elias consegui fazer funcionar.... eu exclui o tomcat no Eclipse (acredito que ele criou uma pasta Servers no mesmo local onde está seu tomcat, deletei ela do disco), depois disso adicionei o Tomcat novamente, funcionou de boa. Mesmo assim abandonei o eclipse e fui para o netBeans que estou mais acostumado. Caso for usar o Netbeans dentro de /META-INF tem um arquivo context.xml, dentro dele o path ta = "", mude para path="/casadocodigo". Espero ter ajudado

Fala amigo Fred_Fagner,

cara eu fiz o que vc sugeriu e nada de funcionar ainda. Não sei o que faço mais, estou emperrado desde ontem nesse problema, fiquei até tarde acordado tentando achar uma solução e levantei cedo pra continuar e nada!!

Vários cursos que fiz esbarro em problemas assim, que vc tem que ter uma bola de cristal pra descobrir o que é, acaba ficando complicado estudar uma tecnologia assim.

Pessoal continuo parado sem solução.

Alguém pode me ajudar?!

Oi Elias, perdão pela demora... Enfim, olhando apenas os trechos de código que você passou, eu não identifiquei o erro. Pode compartilhar o seu projeto no github para eu dar uma olhada?

E liga o hibernate.show_sql = true pra ver se ele ta mesmo fazendo o fetch. Parece até que ele esta usando um outro find, pois seu codigo esta correto

Se voce estiver com deadline, faça uma inicializacao forçada da colecao antes de mandar por Spring. É bem feio, mas tambem é uma forma que vai te ajudar a encontrar o erro.