Lazy loading do Hibernate em aplicações desktop  XML
Índice dos Fóruns » Ferramentas, Frameworks e Utilitários
Autor Mensagem
Rodrigo Manhães
JavaGuru
[Avatar]

Membro desde: 14/07/2005 17:07:07
Mensagens: 242
Localização: Campos dos Goytacazes/RJ
Offline

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?

https://github.com/rodrigomanhaes
http://programacaoradical.blogspot.com
amhfilho
JavaTeenager

Membro desde: 26/01/2005 08:23:41
Mensagens: 167
Localização: São José dos Campos - SP
Offline

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
Virtual Machine Man
[Avatar]

Membro desde: 18/03/2005 16:13:17
Mensagens: 736
Offline

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.

Michael Nascimento Santos, aka Mister M

Summa Technologies do Brasil - http://www.summa-tech.com/
genesis: Uma nova forma de desenvolver aplicações - https://genesis.dev.java.net/
ThinNB: Suporte a Thinlet no NetBeans - https://thinnb.dev.java.net/
Líder da JSR-310 - Date and Time API
Expert Group Member das JSRs 207 (PD4J), 250 (Common Annotations), 270 (Java 2 SE 6.0), 296 (Swing Framework) e 303 (Bean Validation)
SouJava: Fortalecendo a comunidade Java brasileira - https://soujava.dev.java.net/ https://www.soujava.org.br/
JSR Community @ java.net - http://community.java.net/jsr
Blogs - http://blog.michaelnascimento.com.br/ http://today.java.net/pub/au/80
Twitter - @mr__m
[WWW]
Paulo Silveira
Administrador
[Avatar]

Membro desde: 07/08/2002 18:38:50
Mensagens: 4204
Localização: São Paulo
Offline

mister__m wrote: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.


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

http://blog.caelum.com.br twitter: @paulo_caelum


[Email] [WWW]
keller
GUJ Master
[Avatar]

Membro desde: 12/11/2003 16:24:00
Mensagens: 1817
Localização: Auckland - NZ
Offline

Adotamos a maneira feia aqui.

Guilherme I. Keller (Gui)
Diploma in Web Development and Desktop Publishing
SCJA | SCJP | SCWCD | SCBCD | CSM
"Test it, before it test you."
http://flickr.com/guikeller
[WWW] [MSN]
LuizAvila
JavaTeenager
[Avatar]

Membro desde: 07/11/2004 22:35:12
Mensagens: 189
Localização: Florianópolis
Offline

Paulo Silveira wrote:
mister__m wrote: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.


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

Guilherme Keller wrote:Adotamos a maneira feia aqui.


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?

Luiz Ávila
GU Java SC
http://www.gujava.org.br
http://www.baixoacoplamento.blog.br
[WWW] [MSN]
keller
GUJ Master
[Avatar]

Membro desde: 12/11/2003 16:24:00
Mensagens: 1817
Localização: Auckland - NZ
Offline

Cara nao sei te dizer se initialize é especifico do hibernate.
Negocio é que abraçamos o hibernate e vamos com ele..


Guilherme I. Keller (Gui)
Diploma in Web Development and Desktop Publishing
SCJA | SCJP | SCWCD | SCBCD | CSM
"Test it, before it test you."
http://flickr.com/guikeller
[WWW] [MSN]
dias.rodolfo
Smalltalk

Membro desde: 11/04/2007 07:46:00
Mensagens: 3
Offline

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.
 
Índice dos Fóruns » Ferramentas, Frameworks e Utilitários
Ir para:   
Powered by JForum 2.1.8 © JForum Team