Não tenho nenhum projeto desenvolvido com hibernate, mas do pouco que conheco da tecnologia creio que um Servlet Filter seja a solução.
Dos testes que fiz não tive mais problemas com Lazy fectch.
Costumo usar Hibernate.initialize(Object obj); quando preciso que entidades com mapeamentos lazy=true disponibilizem todas suas propriedades e relacionamentos acessiveis.
Caso tenha acabado de ler o objeto, você não precisará usar o initialize, desde que voce acesse as propriedades dentro da mesma transaction.
M
mrmarcondes
Pelo JPA há 2 maneiras que conheco para resolver esse problema:
No seu método que faz a pesquisa voce usa collection.size() para inicializar a colecao e automaticamente essa collection eh alimentada.
Dentre as opções postadas, a mais ‘elegante’ é usar um Filter para garantir que a sessão seja única do iníco ao fim do request (como o aeugenio sugeriu). Ela garante que cada chamada lazy se comporte como você deseja: traz os dados apenas quando necessário. Você evitará de ficar fazendo códigos para inicializar o objeto ou setar o tamanho em cada requisição ao db.
O problema em usar um Hibernate.initialize(Object obj); é que este código deverá ser implementado em seu DAO ou até no get do seu objeto list. Ambos os casos não são bons por misturar as coisas. Ao usar o size o problema é o mesmo.
Ressalto que todos funcionam, mas recomendo que você utilize o Filter.
M
mrmarcondes
Na minha opiniao a melhor solucao eh fazer a busca atraves de JOIN FETCH:
simples, basta criar uma namedQuery;
faz parte da especificacao JPA;
nao fica preso a implementação do hibernate.
Marco.
D
dmitsuo
Pessoal,
Aminhadúvidaé,comomodelodeprogramaçãoEJB3queestouutilizando,ouseja,JSFparavisão,controladoresimplementadoscomoEJBs,queporsuavezacessamDAOs,quesãoEJBsStatelessequefazemreferênciaaumEntityManagerinjetadopelocontainer(videarquiteuradosistemadeexemplodositedoHibernate--[url=http://www.hibernate.org/400.html]CaveatEmptor JPA/EJB 3.0[/url]), não haveria uma solução que tirasse proveito dessa arquitetura? Em outras palavras, a Sun, com o advento do EJB3, não forneceu nenhuma solução padrão para esse tipo de problema tão comum em aplicações web (LazyInitializationException)? Ah sim, antes que alguém mencione, não é uma opção minha utilizar o Seam.