| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/04/2010 08:35:53
|
andre_a_s
GUJ Ranger
![[Avatar]](/images/avatar/3328bdf9a4b9504b9398284244fe97c2.jpg)
Membro desde: 23/02/2003 01:04:53
Mensagens: 755
Localização: Santo André(SP)
Offline
|
Bo dia senhores.
Possuo um objeto A que possui uma collection de objetos B
Um determinado objeto A, possui quase 40.000 objetos B, e tenho uma tela que lista todos ops objetos B. O grande problema é que 40.000 objetos selecionados na tela acaba dando OutOfMemory.
O mais correto seria fazer uma paginação, onde selecionaria apenas 50 objetos B de cada vez.
Pergunta: Como posso fazer isso, se ao executar a.getBs(), o Hibernate já me retorna tudo de uma vez ? Com query nativa, eu faria os selects em lote e tudo se resolveria, mas não gostaria de criar essas consultas nativas.
Como posso resolver isto ?
|
Gosta de cerveja e de viagem?
Visite meu blog!
http://www.TravelAndBeer.com |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/04/2010 11:50:08
|
marcelo.martins
What is classpath?
Membro desde: 24/03/2010 12:15:57
Mensagens: 7
Offline
|
Ola Vc pode fazer assim:
Contando os registros.
Paginado o seu resultado:
Qualquer duvida poste ai...
This message was edited 1 time. Last update was at 08/04/2010 11:51:17
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/04/2010 12:19:41
|
andre_a_s
GUJ Ranger
![[Avatar]](/images/avatar/3328bdf9a4b9504b9398284244fe97c2.jpg)
Membro desde: 23/02/2003 01:04:53
Mensagens: 755
Localização: Santo André(SP)
Offline
|
Sim, via HQL é possivel, mas seria possivel SEM HQL ?
|
Gosta de cerveja e de viagem?
Visite meu blog!
http://www.TravelAndBeer.com |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/04/2010 13:27:31
|
garcia-jj
JWizard
Membro desde: 13/04/2009 22:11:50
Mensagens: 2715
Localização: Porto Alegre
Offline
|
andre_a_s wrote:Sim, via HQL é possivel, mas seria possivel SEM HQL ?
O que seria sem HQL? Com criteria?
|
http://github.com/garcia-jj
Não respondo dúvidas via MP. Use o fórum. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/04/2010 14:15:42
|
roger_rf
GUJ Master
Membro desde: 29/04/2009 07:40:19
Mensagens: 1091
Localização: Natal/RN
Offline
|
Não sei se é exatamente isso que você procura, mas talvez a técnica de "batch fetching" seja útil:
http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html#performance-fetching-batch
|
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/04/2010 14:27:02
|
andre_a_s
GUJ Ranger
![[Avatar]](/images/avatar/3328bdf9a4b9504b9398284244fe97c2.jpg)
Membro desde: 23/02/2003 01:04:53
Mensagens: 755
Localização: Santo André(SP)
Offline
|
garcia-jj wrote:
andre_a_s wrote:Sim, via HQL é possivel, mas seria possivel SEM HQL ?
O que seria sem HQL? Com criteria?
Não necessariamente.
Por exemplo, hoje, quando executo a.getBs(), ele me traz todos os objetos B dentro de A. Isso não é feito via HQL, é feito automático pelo mapeamento.
Estou procurando uma alternativa para trazer os mesmos objetos B, executando por exemplo getBs(1, 50), para pegar do primeiro ao quinquagésimo.
Minha duvida é, este tipo de coisa só é possivel via HQL/Criteria, ou é possivel fazer via mapeamento, como o link que roger_rf passou ?
|
Gosta de cerveja e de viagem?
Visite meu blog!
http://www.TravelAndBeer.com |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/04/2010 16:47:10
|
marcelo.martins
What is classpath?
Membro desde: 24/03/2010 12:15:57
Mensagens: 7
Offline
|
Ola,
O mapeamento do objeto A ou B individualmente, vc pode fazer da forma de exemplifiquei ou por Criteria...
Se quizer te mostro como fazer com Criteria,
Porem se vc tem este cenario:
Então neste cenario, acredito que não tenha como vc paginar a lista B,
Posso estar dizendo besteira, mas pense bem:
Como vc ia estar limitando o numero de registros dentro desta lista?
No minimo o hibernate teria que manter a sessão aberta e ficar gerenciando sua interação em tempo de execução...
Não sei se tem como vc fazer isso...
O que vc pode estar fazendo é remover o objeto filho, e tratalo de forma independente.
Porem ja te adiantando, se vc fizer por exemplo um combo com sujestion, ficara pesado tambem.
Mas se a sua consulta estiver muito pesada com o objeto filho dentro de A, vc pode remove-lo...(dependendo de como estão suas telas e relacionamentos)
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/04/2010 10:30:56
|
garcia-jj
JWizard
Membro desde: 13/04/2009 22:11:50
Mensagens: 2715
Localização: Porto Alegre
Offline
|
Pelo que entendi você quer fazer paginação pelo mapeamento one-to-many da entidade, e isso não é possível.
Na verdade eu sou bem contra fazer mapeamentos bidirecionais to tipo one-to-many e many-to-one. No seu caso A possui muitos B, então o correto é A não possuir a coleção de B, mas B possuir a referencia para A. Não gosto de usar A.getB, e um dos motivos é de você carregar todos os registros da base sem distinção.
O mais correto, na minha opinião, é você fazer uma chamada via HQL ou criteria para trazer todos os B que são filhos de A com seus critérios de paginação.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/04/2010 13:05:02
|
Tecnoage
GUJ Master
Membro desde: 13/03/2005 23:18:07
Mensagens: 1723
Localização: SP
Offline
|
eu tb estava algum tempo atrás procurando uma resposta para isso, acabei construindo via query mesmo...
|
Arquiteto de Software
Sysped Solutions
R3 SAP CAT-83, NF-e, ECD, EFD, CT-e, MANAD, IN86
www.sysped.com.br |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/04/2010 16:02:52
|
thiago.correa
GUJ Master
![[Avatar]](/images/avatar/c37f9e1283cbd4a6edfd778fc8b1c652.jpg)
Membro desde: 26/03/2006 18:54:30
Mensagens: 1861
Offline
|
Foi por coincidência que eu achei isso na documentação do hibernate, veja se adianta
|
---
"Se não puder ajudar, atrapalhe, afinal de contas o importante é participar!"
Thiago
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/04/2010 17:21:56
|
Tecnoage
GUJ Master
Membro desde: 13/03/2005 23:18:07
Mensagens: 1723
Localização: SP
Offline
|
funcionalmente é desse modo que se faz, porém o que procurei ( e ainda procuro ) é algum mecanismo que faça para um relacionamento 1:N lazy, por exemplo a paginação automática, sem a necessidade de criar uma hql ou uma critéria para isso.
|
Arquiteto de Software
Sysped Solutions
R3 SAP CAT-83, NF-e, ECD, EFD, CT-e, MANAD, IN86
www.sysped.com.br |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/04/2010 21:34:05
|
garcia-jj
JWizard
Membro desde: 13/04/2009 22:11:50
Mensagens: 2715
Localização: Porto Alegre
Offline
|
Tecnoage wrote:funcionalmente é desse modo que se faz, porém o que procurei ( e ainda procuro ) é algum mecanismo que faça para um relacionamento 1:N lazy, por exemplo a paginação automática, sem a necessidade de criar uma hql ou uma critéria para isso.
Se você ler meu comentário verá que realmente usando o relacionamento não há como fazer paginado. E se você procurar na community manuals do hibernate (não sei se no site do jboss novo tem isso) há um post que fala exatamente do quão ruim é você ter bidirecionais e sair usando algo como:
Sendo que o correto é você ter apenas o relacionamento de Debit.customer, e não ambos Debit.customer e Customer.debits.
A forma mais correta de você paginar é usar o que o Thiago indicou no post dele. Formula mágina para paginação você não irá encontrar.
|
http://github.com/garcia-jj
Não respondo dúvidas via MP. Use o fórum. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/04/2010 11:44:41
|
Tecnoage
GUJ Master
Membro desde: 13/03/2005 23:18:07
Mensagens: 1723
Localização: SP
Offline
|
garcia-jj wrote:
Tecnoage wrote:funcionalmente é desse modo que se faz, porém o que procurei ( e ainda procuro ) é algum mecanismo que faça para um relacionamento 1:N lazy, por exemplo a paginação automática, sem a necessidade de criar uma hql ou uma critéria para isso.
Se você ler meu comentário verá que realmente usando o relacionamento não há como fazer paginado. E se você procurar na community manuals do hibernate (não sei se no site do jboss novo tem isso) há um post que fala exatamente do quão ruim é você ter bidirecionais e sair usando algo como:
Sendo que o correto é você ter apenas o relacionamento de Debit.customer, e não ambos Debit.customer e Customer.debits.
A forma mais correta de você paginar é usar o que o Thiago indicou no post dele. Formula mágina para paginação você não irá encontrar.
Não estamos falando necessariamente em relacionamentos bidirecionais, muito pelo contrário.
A meu ver essa paginação AINDA é burra, força meu código "cliente" a fazer iterações baseadas em limites da query. Em termos de código LIMPO, essa é a pior solução, mas até onde encontrei é a única.
Isso geralmente resolve os problemas de sistemas onde ALGUMAS queries podem "explodir" a memória, mas torna sistemas com monstruosas quantidades de informações labirintos lógicos.
E esse é somente uma das limitações do hibernate. Existem uma série de outras, como a não inclusão de tipos PK (simples ou compostas) e qualquer relacionamento em queries do tipo example, por exemplo...
|
Arquiteto de Software
Sysped Solutions
R3 SAP CAT-83, NF-e, ECD, EFD, CT-e, MANAD, IN86
www.sysped.com.br |
|
|
 |
|
|