Velho Problema de Lazy Loadding

20 respostas
fabianofrizzo

Boa tarde Galera.

Eu estou com algumas duvidas ainda sobre o bom é velho problema de Lazy Loading. Mas se acalmen não criemos panico hehehe..
Eu consegui resolver o problema de Lazy em parte em um pequeno projeto de testes aqui. Mas acho(tenho quase certeza na verdade que não foi a melhor solução).

Vou descrever como eu fiz.

Faço as minhas criteria utilizando Projections. Assim busco só os campos das classes que não são listas, ou outro objetos que não sejam tipos do Java.Vou colocar um pequeno exemplo aqui.

Tenho a Classe Empresa e dentro de Empresa tenho um List
Ai para evitar o problema de Lazy busco só os dados da empresa

Criteria c = super.session.createCriteria(Empresa.class, "empresa");
       
        ProjectionList projectionList = Projections.projectionList().create();
        projectionList.add(Projections.property("empresa.cod"),"cod");
        projectionList.add(Projections.property("empresa.razao"),"razao");
        projectionList.add(Projections.property("empresa.etc"),"etc");
        c.setProjection(projectionList);

Mas isso me tras sérios problemas se eu precisar fazer um c.add(Restrictions.eq("empresa.cod", cod)); Ao invés do hibernate utilizar isso na clausula Where ele usa um alias que ele criou para a consulta no SELECT ai digamos ele colocaria algo + ou - assim where _y0 = 1 ai é lógica o banco não executa o SQL pois ele não conheçe o camo y0.

Bem esse é um dos problemas mais ainda é facil solucionado pois dai monta as clausulas where e manto elsa com o Restrictions.sqlRestrictions.

Mas o problema mesmo é se eu precisar da lsita de USUARIOS para mandar para o FLEX junto com a EMPRESA. Vou ter que fazer uma nova consulta no banco buscando só os dados do usuário. Até ai Blza Porém se eu tenho um List e dentro de cada Empresa eu tenho um List eu tenho que fazer o for para varrer o list de empresa e buscar todos os usuários relacionados aquela empresa. e setalos no list.

Eu acho que isso ta completamente errado. Mas não consegui pensar em nenhuma outra solução para isto se alguém puder compartilhar experiencia sobre isso ficarei muito grato.

Ou Se puderem dizer se usam mais HQL ou Criteria.

Desculpa pelo extenso texto. Mas essa questão ja vem me encomodando a uns 6 meses. E eu sempre procurando solução para isso mais sem muito sucesso.

Obrigado pela Atenção de todos.

20 Respostas

GraveDigger

Olá,

O que você está usando para comunicação ? BlazeDS ?

Não puxar os campos Lazy não é uma forma de resolver o problema, é uma forma de evitá-lo.

O tratamento adequado depende do que você usa para comunicação.

Estou num projeto que usa Tide + Seam + GraniteDS e isso é feito automáticamente. Dê mais detalhes de como é feita essa comunicação Flex<->Java

Att,

fabianofrizzo

Intão eu também utilizo o GraniteDS.

É a forma a qual eu fiz é na verdade uma maneira de evitalos. E não de resolver.

Isso descreve bem o que eu fiz.
Como a maioria do pessoal que vejo utiliza Spring.

Eu como ja usava o mentawai resolvi fazer um projeto para integrar o mentawai ao Flex.
PEsquisando na internet achei alguém que ja havia começado com isso. o Velo ai só dei continuidade no projeto.

O mesmo está hospedado no Sourceforge http://sourceforge.net/projects/mentaflex/

Bom vi que vc utiliza o Tide + Seam. Eu ja havia tentado utilizar os mesmo. Mas não tive muito sucesso.
Também tentei utilizar a solução do próprio Granite mas pelo que vi ele só funciona bem com o Tide e o Seam Mesmo.

Vc poderia me dar algumas dicas sobre o Tide + Seam.

Att.

GraveDigger

Realmente a config Tide + GrantieDS + (Seam|Flex) não é das coisas mais tranquilas,hehe.

Mas há uma lista de discussão do yahoo chamada GraniteDS tem o pessoal bem ativo(eu inclusive)

Por ser um processo um pouco trabalhoso, fica difícil eu te dar alguma dica, mas se tiver alguma dúvida mais específica(como configurar um JMS pra enviar Mensagens ao flex por exemplo) eu já poderia ajudar melhor.

Dê uma olhada na lista, uma boa lida no tutorial que acredito que você consiga configurar, eventuais dúvidas pode me perguntar, mas explicar o processo todo fica redundante com a doc.

Abs

fabianofrizzo

Opa.

Eu também participo da lista. Não so muito ativo mas to sempre lendo os emails.

Mas me diz uma coisa. Vc ta contente com os resultados que o TIDE + SEAM estão te trasendo?

E sobre o problema de Lazy vc teria alguma outra dica.

GraveDigger

Cara,

Estou bem feliz sim com Tide + Seam, nem parece que estou trabalhando com duas linguagens, parece uma coisa só.

Chamo o service Java a partir do flex mandando o mesmo parâmetro o resto acontece automáticamente.

Mas o ponto mais forte que fez um verdadeiro diferencial no meu projeto foi poder enviar JMS do Java e capturar no flex, no meu projeto em específico ficou simplesmente animal :slight_smile:

Minha única reclamação é com relação a algumas alterações que fizeram na versão 2.0.0.SP1, parece que removeram algumas mensagens que ajudava no debug, agora quando uma classe Java não está sincronizada com sua contraparte no flex, fica difícil debugar.

Mas no geral estou bem satisfeito, recomendo que você tire um tempinho para tentar configurar novamente o ambiente.

Com relação ao Lazy não tenho nenhuma dica em específico pois isso é feito automaticamente, então fica transparente aqui pra mim :slight_smile:

Abs

AUser

Olá Galera,

Só tenho para anunciar que estou debugando algumas coisas e vou lançar um snapshot do Hibernate (core 3.5.0) com essa correção. Não vai ser preciso fazer nada, só mudar o Hibernate para essa versão. E vou postar a solução que usei para isso, também. Ainda estou estudando algumas coisas. Mas a previsão é que seja até o meio de dezembro ou final, no máximo.

[]'s!!!

fabianofrizzo

A Amigo não coloca pilha. Não hehhehe

Da uma palinha ai do que tu ta fazendo. Assim podemos contribuir com a idéia.

AUser

Olá,

Surpresa, rs. Quando lançar aviso. Mas posso começar dizendo que o problema principal não é no BlazeDS, mas uma “lógica” do Hibernate. Que até faz sentido, mas nesse caso é errônea.

[]'s

S

AUser:
Olá,

Surpresa, rs. Quando lançar aviso. Mas posso começar dizendo que o problema principal não é no BlazeDS, mas uma “lógica” do Hibernate. Que até faz sentido, mas nesse caso é errônea.

[]'s

Boa noite amigo, vc sabe me responder se a receita BlazeDS + hibernate/Lazy Loadding já esta funcionando corretamente?

Desde já, Obrigado.
Sandro Mueller

viniciuspadua

ja esta funcionando ?

T

Eu Tb já tive este problema com o lazy no JPA/Hibernate. Para resolver este problema é preciso carregar os Objetos filhos utilizando a classe
Hibernate.inicilizatio(listaDeObjetoFilhos) em toda consulta, não achei uma solucão muito agradável , então em uma última aplicação que eu estou desenvolvendo estou utilizando JPA2.0/EclipseLink e não tive mais este problema. Só JNDI com o TomCat que deu alguns problemas.

UpTheIrons

Tb estou usando o EclipseLink, o problema é q num volume de dados “maior”,
numa relação NxN por ex, pra chegar na camada Flex, o “trânsito” é demasiadamente
lento.

H

Olá, utilize essa API, http://sourceforge.net/projects/setlazynull/

Isso vai resolver o problema de lazy que ocorre na sua aplicação caso não nao conseguirem entender tem um post no forum explicando a utilização da ferramenta.

UpTheIrons

Testei, aqui n deu certo… pelo menos o prob de lentidão continua.
Se n dar certo, acho q vou usar mais “views” e alguns DTOs…

Mas, valeu.

H

Como que vc montou, vc jogou a anotação em cima do metodo que busca do banco? posta o codigo de como ficou pra mim ver.

UpTheIrons
@LazyNull

public List getList(){

return sbGetList(Tipo.class, select ct from Tipo ct order by ct.descricao);

}

Entidade Conta e Tipo são do tipo NxN

H

Pelo que notei vc está utilizando EclipseLink a API está na versao 1 nao tem ainda suporte para o EclipseLink so para o Hibernate mas vou deixar anotado para futuramente eu fazer essa implementação.

Grato.

UpTheIrons

Hm, como minha aplicação está no início, eu até mudaria pra Hibernate, por enqto
fiquei com a ideia de usar DTOs pra alguns casos (Entidades com relacionamentos
NxN tá osso), mas vou fazer uns testes com o Hibernate.

H

O problema de usar DTO é que ele cria muitas classes então isso faz o projeto ficar muito grande tente usar o Hibernate (acho melhor)

UpTheIrons

Pensei nisso e pensei tb numa “gambiarra”. Como meu prob de performance tá
no relacionamento NxN… pensei em fazer 1xN - 1xN, mas fazer da tabela associativa
uma entidade forte (com PK própria) e fazer o relacionamento através de Join entre
as 3 tabelas, apenas pra testar, pq eu n sei de que forma o EclipseLink tá fazendo a
consulta (SQL), só sei q tá demorando pra caramba.

Criado 23 de novembro de 2009
Ultima resposta 6 de nov. de 2010
Respostas 20
Participantes 8