Lazy loading do Hibernate em aplicações desktop

7 respostas
Rodrigo_Manhaes

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?

7 Respostas

A

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. :slight_smile:

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…

:wink:

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.

Criado 21 de março de 2007
Ultima resposta 11 de abr. de 2007
Respostas 7
Participantes 7