Tenho um sistema com interface desktop acessando um servidor JBoss gerenciando a dobradinha EJB+Hibernate.
O problema está na utilização de lazy loading. Todas as sessions Hibernate estão no servidor. Quando um objeto chega ao cliente e eu tento obter algum objeto do grafo que tenha que ser carregado eu obtenho um LazyInstantiatonException. Só consegui resolver o problema setando lazy-loading para false em todos os mapeamentos. Só que, como o modelo é bastante complexo, uma grande quantidade de informações é enviada ao cliente, a ponto de deixar o sistema lento, mesmo em rede local.
Como trazer a lógica de acesso ao cliente está fora de cogitação (pois também temos sistemas com interface web compartilhando lógica), há como contornar isto no próprio Hibernate?
De alguma forma você deve estar fechando a Session quando faz a leitura do objeto no banco. Para aplicações desktop é interessante abrir uma session no início da aplicação e fechá-la somente na saída, você poe configurar um listener para isso.
mister_m
Muito provavelmente a solução seria fazer fetch join nas suas queries ou initialize(Object) nos objetos requeridos na outra ponta da aplicação. Em alguns outros cenários, em que somente se o usuário fizer alguma ação um bean será acessado, você deve realizar outra query contra o servidor.
Paulo_Silveira
resposta perfeita. so para dar minha opiniao nessas 3 possibilidades que o michael deu, minha ordem de preferencia:
1- fazer outra query: fica sem magica e fica explicito que uma query sera executada.
2- fetch join é bem elegante. e com isso voce faz override da opcao default de suas colecoes
3- eu acho feio ficar chamando o initialize…
keller
Adotamos a maneira feia aqui.
LuizAvila
resposta perfeita. so para dar minha opiniao nessas 3 possibilidades que o michael deu, minha ordem de preferencia:
1- fazer outra query: fica sem magica e fica explicito que uma query sera executada.
2- fetch join é bem elegante. e com isso voce faz override da opcao default de suas colecoes
3- eu acho feio ficar chamando o initialize…
E no caso do uso com JPA? Apenas as api’s da especificação, o initialize é especifico do Hibernate?
Ou seja em uma eventual adoção da api JPA, esta abordagem geraria um prolema, existe o equivalente do initializa para JPA?
keller
Cara nao sei te dizer se initialize é especifico do hibernate.
Negocio é que abraçamos o hibernate e vamos com ele…
dias.rodolfo
Existe um framework chamado DataSlim http://code.google.com/p/dataslim/ que trata especificamente de Lazy Loading, segundo o que pude ver do seu problema ele trata bem isso.