Primefaces + JSF2.0 - p:dataTable - o método get é executado varias vezes no lifeCycle

Comecei a trabalhar a pouco tempo com jsf e acabei me deparando com uma situação que me preocupou um pouco, ao debugar a paginação do componente p:dataTable percebi que o método get que carrega a lista para o dataTable é executado varias vezes dentro de um único clico de vida.

Tem como evitar que isso ocorra?

Aplicação roda no apache tomcat 7.

é normal executar varias vezes o(s) método(s) get()
dos atributos.

[quote=kleberdamasco]é normal executar varias vezes o(s) método(s) get()
dos atributos.[/quote]

Mas tem como evitar? Pois o metodo get esta com a logica da paginação e acaba executando a query varias veses.

[quote=tjalencar][quote=kleberdamasco]é normal executar varias vezes o(s) método(s) get()
dos atributos.[/quote]

Mas tem como evitar? Pois o metodo get esta com a logica da paginação e acaba executando a query varias veses.[/quote]

estás usando o lazy?

tens como colocar o método get() ?

em resumo seria mais ou menos assim

public object seuMetodoGet() {

if(object == null) {
object = new Object();
}

return object;

[quote=kleberdamasco]
estás usando o lazy?

tens como colocar o método get() ?[/quote]

Não estou usando o lazy. o problema não esta no get, o problema é ele ser executado varias vezes, em um único ciclo de vida, quando repagina o dataTable ele executa todos os ciclos e o método executa varias vezes em cada ciclo.

[quote=tjalencar][quote=kleberdamasco]
estás usando o lazy?

tens como colocar o método get() ?[/quote]

Não estou usando o lazy. o problema não esta no get, o problema é ele ser executado varias vezes, em um único ciclo de vida, quando repagina o dataTable ele executa todos os ciclos e o método executa varias vezes em cada ciclo. [/quote]

Então não faça de jeito oras… Isso é do ciclo de vida do JSF e não tem como evitar… Crie sua lista; e popule-a ( Logica + Queries) no construtor do seu MB, ou em um método anotado com @PostConstruct. No get você só retorna a lista.

ficaria mais fácil se você colocasse o seu método get()
para dar uma olhada!

[quote=diegosammet]

Então não faça de jeito oras… Isso é do ciclo de vida do JSF e não tem como evitar… Crie sua lista; e popule-a ( Logica + Queries) no construtor do seu MB, ou em um método anotado com @PostConstruct. No get você só retorna a lista.[/quote]

Amigo eu sei o que é o ciclo de vidas e sei como funciona, o que estou questionando é múltipla execução dentro de um ciclo de vida, mesmo com o @PostConstruct acontece a mesma coisa.

Não teria vindo aqui questionar uma coisa sem ter efetuado vários testes.

Esta tudo funcionando perfeitamente, só criei o tópico para intender o que esta ocorrendo.

você poderia colocar o seu método get()?

[quote=tjalencar][quote=diegosammet]

Então não faça de jeito oras… Isso é do ciclo de vida do JSF e não tem como evitar… Crie sua lista; e popule-a ( Logica + Queries) no construtor do seu MB, ou em um método anotado com @PostConstruct. No get você só retorna a lista.[/quote]

Amigo eu sei o que é o ciclo de vidas e sei como funciona, o que estou questionando é múltipla execução dentro de um ciclo de vida, mesmo com o @PostConstruct acontece a mesma coisa.

Não teria vindo aqui questionar uma coisa sem ter efetuado vários testes.

Esta tudo funcionando perfeitamente, só criei o tópico para intender o que esta ocorrendo.

[/quote]

O problema é o NOME do método, entendeu? Qualquer método GET que esteja no MB é executado várias vezes, se você tiver as consultas dentro de um get ele irá executar N vezes e não a nada que você possa fazer sobre isso.

[quote=kleberdamasco]ficaria mais fácil se você colocasse o seu método get()
para dar uma olhada![/quote]

       public DataModel<Usuario> getUsuarios() {
		UIData tabela = getTabela("formManterUsuario","tabelaManterUsuarios");
		int primeiroReg = -1;
		int paginaSize = -1;
		if(tabela==null){
			primeiroReg = 1;
			paginaSize = 5;
		}else{
			primeiroReg = tabela.getFirst();
			paginaSize = tabela.getRows();
		}
		try {
			if(totalRegistros ==0){
				totalRegistros=usuarioController.pesquisarPorFiltroCount(filtro);
			}
			listaUsuarios = usuarioController.pesquisarPorFiltro(filtro,primeiroReg,paginaSize);
			this.usuarios = new GenericDataModel<Usuario>(listaUsuarios, totalRegistros, paginaSize);
		} catch (UsuarioException e) {
			addMessage(e.getMessage());
		}
		
		return usuarios;
	}
        public List<Usuario> getListaUsuarios() {

		return listaUsuarios;
        }

Tanto em um método como no outro ocorre a mesma coisa.

o GenericDataModel é uma extensão de DataModel

[quote=diegosammet]

O problema é o NOME do método, entendeu? Qualquer método GET que esteja no MB é executado várias vezes, se você tiver as consultas dentro de um get ele irá executar N vezes e não a nada que você possa fazer sobre isso.[/quote]

valeu.

[quote=diegosammet][quote=tjalencar][quote=diegosammet]

Então não faça de jeito oras… Isso é do ciclo de vida do JSF e não tem como evitar… Crie sua lista; e popule-a ( Logica + Queries) no construtor do seu MB, ou em um método anotado com @PostConstruct. No get você só retorna a lista.[/quote]

Amigo eu sei o que é o ciclo de vidas e sei como funciona, o que estou questionando é múltipla execução dentro de um ciclo de vida, mesmo com o @PostConstruct acontece a mesma coisa.

Não teria vindo aqui questionar uma coisa sem ter efetuado vários testes.

Esta tudo funcionando perfeitamente, só criei o tópico para intender o que esta ocorrendo.

[/quote]

O problema é o NOME do método, entendeu? Qualquer método GET que esteja no MB é executado várias vezes, se você tiver as consultas dentro de um get ele irá executar N vezes e não a nada que você possa fazer sobre isso.[/quote]

Pode sim cara!!! Sai do JSF :twisted:

Claro, parar de usar um framework só pra evitar um :

lista = metodoQuePopulaLista();

no construtor? No, thanks…

Claro, parar de usar um framework só pra evitar um :

lista = metodoQuePopulaLista();

no construtor? No, thanks…[/quote]

aiai camarada, se fosse só isso… 8)

Algumas pessoas que também pensam igual:

http://ihatejsf.com/

Ó Haters, se soubessem que 90% dos problemas do JSF é falta de estudo, tudo seria mais fácil. Anyway, falando sério agora. JSF não é perfeito, não é bala de prata, não resolve todos os problemas do mundo, mas cumpre com propriedade o que foi projetado para fazer… É só aprender de VERDADE como fazer.

Só sei de uma coisa Component Based FW nunca mais…

Tá bom se for por muita grana to dentro. :oops: