Hibernate fazendo um mesmo select por cada registro

Oiiii !

Tenho 2 buscas e notei que uma demora bem mais que a outra.
As duas trazem a mesma qtdade (75) de registros e possuem relacionamentos com outras tabelas.
Todos os relacionamentos estão como Lazy. Olhei o log do hibernate e verifiquei que na mais rapida o hibernate faz apenas um select e na outra ele faz um monte.
Nessa mais lenta eu contei que ele fez um mesmo select para cada um dos 75 registros.
Aliás, para cada relacionamento ele fez 75 selects. Estou tentando entender o pq que ele faz isso.
Existe algo que eu deva verificar ? Algum padrão ou tipo de relacionamento que causa isso ?

Como está o código, mapeamento e query?

[quote=G@bi]Oiiii !

Tenho 2 buscas e notei que uma demora bem mais que a outra.
As duas trazem a mesma qtdade (75) de registros e possuem relacionamentos com outras tabelas.
Todos os relacionamentos estão como Lazy. Olhei o log do hibernate e verifiquei que na mais rapida o hibernate faz apenas um select e na outra ele faz um monte.
Nessa mais lenta eu contei que ele fez um mesmo select para cada um dos 75 registros.
Aliás, para cada relacionamento ele fez 75 selects. Estou tentando entender o pq que ele faz isso.
Existe algo que eu deva verificar ? Algum padrão ou tipo de relacionamento que causa isso ?

[/quote]
Esse é um problema conhecido como SELECT N+1, provavelmente decorrente de você utilizar Lazy e carregar esses elementos sob-demanda, ou seja, para cada umas das 75 linhas da sua consulta, ele vai fazer 1 select a mais para trazer os elementos Lazy.

Para resolver o problema você pode marcar o relacionamento como Eager, caso tenha interesse que ele smepre seja carregado, ou podes utilizar um JOIN FETCH.

O problema é que eu não carrego eles por demanda.
Pelo menos não tem nada na tela que utiliza eles.
Oq faço é a busca e já ai ele faz todas esses selects.

Eu tenho muitas tabelas e relacionamentos diversos entre elas, ai utilizei o hibernate tools pra me ajudar.
E vi q até nos relacionamentos OneToOne ele colocou como Lazy.
Mudei para Eager e a busca que demorava 17seg caiu pra menos de 1seg

Vou tirar o fetch do OneToOne que o hibernate tools criou

:smiley:

Coloquei o fetch para EAGER em todos os relacionamentos OneToOne do sistema e voltou a ficar demorado e fez varios selects.
Voltei tudo para LAZY e deixei como EAGER somente na classe que faço a busca e ai ficou rapido de novo.

E agora ?
Nem sempre é bom ter um relacionamento OneToOne como EAGER ?

[quote=G@bi]Coloquei o fetch para EAGER em todos os relacionamentos OneToOne do sistema e voltou a ficar demorado e fez varios selects.
Voltei tudo para LAZY e deixei como EAGER somente na classe que faço a busca e ai ficou rapido de novo.

E agora ?
Nem sempre é bom ter um relacionamento OneToOne como EAGER ?[/quote]
Deixa no mapeamento como Lazy e usa Criteria aplicando fetch para gerar SQL único com as informações das tabelas necessárias. Só use Eager no mapeamento quando tiver certeza que aquela informação sempre será acessada. http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querycriteria.html

javaflex obrigada !
Eu já estava usando criteria, mas desconhecia essa possibilidade de fetch dinamico !