Hibernate+JSF - Query executando varias vezes

7 respostas
JAVADRIANO

E ai pessoal tudo certo?
estou desenvolvendo um sistema com hibernate + jsf.
Na minha pagina estou exibindo os dados em um datatable, e esta tudo certo aperece o numero de dados corretamente.
Mas parece que ele esta executando a query varias vezes… quando faço um for ele repete o mesmo usuario varias vezes.

Isso é normal???

7 Respostas

JAVADRIANO

Desculpa!
Agora sim…

private List<Atividade> ListToUser(String usuarioLog2) {
Session session = HibernateUtil.getSession();
Query q = session.createQuery("FROM Atividade as ativ where ativ.resposnavel.nome LIKE :usuarioLog2");
q.setParameter("usuarioLog2","%"+usuarioLog2);
List<Atividade > atividadesUser = q.list();

setUserToMail(atividadesUser);

return atividadesUser;
}



private void setUserToMail(List<Atividade> atividadesUser) {
for(int i=0;atividadesUser.size();i++){
System.out.println(atividadesUser.get(i).getResposnavel().getNome());
String nome = atividadesUser.get(i).getResposnavel().getNome();
String emailUser = atividadesUser.get(i).getResposnavel().getEmail();
//mail.EnviaMail(nome, emailUser);
}

}
rogelgarcia

No JSF essas várias chamadas acontecem mesmo… o pessoal mais especialista pode ter uma ideia de como minimizar…

JAVADRIANO

Obrigado por responder rogelgarcia…

Pois é… estou me batendo pois preciso enviar emails para cada usuario e assim não dando.
Se alguém puder me dar uma dica de como fazer para enviar e-mails dessa forma, com os contatos de e-mail vindos do banco.

Valeu… :wink:

Leozin

Pode ser que você esteja com eager loading ativado, aí quando o teu objeto é carregado do banco, já carrega todas as dependências juntos (e aí verás muitas queries sendo executadas)

JAVADRIANO

Vou dar uma olhada nisso Leozin…
Mas isso só não vai ser exibir as depêndencias né?

Leozin

Adriano,

Quando uma classe tem um atributo que na verdade é outra classe (digamos, Pessoa tem Veículos), essa associação é carregada automaticamente SE o fetch estiver configurado como EAGER. Se for LAZY, ele vai ser carregado somente quando você der um pessoa.getVeiculos().

Se todas as tuas classes estiverem como EAGER, a consulta mais simples vai efetuar muitos selects e vai deixar a tua aplicação muito lenta.

Verifique isso e depois poste aqui o resultado.

Abraço

JAVADRIANO

Leozin,

Desculpe se isso for muito básico, mas configurar para LAZY seria isso? Colocar no meu relacionamento:

@ManyToOne(fetch=FetchType.LAZY)
private Usuario resposnavel = new Usuario();

Ou como faço para confirgurar minhas classes?
Obrigado.

Criado 24 de março de 2010
Ultima resposta 29 de mar. de 2010
Respostas 7
Participantes 3