Renderização componente dataTable primefaces

Boa tarde pessoal, estou com um problema quanto a reenderização de componentes do primefaces 2.2.1. Estou tentando atualizar um datatable logo após o processo de save de um objeto no banco… porém a property “update” do componente button não está funcionando ou mesmo está implementada de forma errada. Segue abaixo o trecho xhtml.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:p="http://primefaces.prime.com.tr/ui">
<f:view>	
<h:body>

	<ui:composition template="../template/Layout.xhtml">

		<ui:define name="content">
			<f:loadBundle basename="com.everis.epersonas.bundle.messages" var="msg"/>
			<h:form id="categoriaForm">
				
				<center>
				
				<p:panel id="painelCadastro"
					header="Cadastrar nova Categoria"
					style="text-align:left;width:700px;">
					
					<h:messages />
						<h:panelGrid columns="2">
	
										
							<h:outputLabel value="#{msg.nomeCategoria}" />
							 <p:inputText id="nome"
								value="#{categoriaController.categoria.nomeCategoria}" size="45" />
	                         
							<h:outputLabel value="#{msg.descricaoCategoria}" />
							 <p:inputText id="descricao"
								value="#{categoriaController.categoria.descricaoCategoria}" size="45" />
							                          
	
						</h:panelGrid>
						<br />

						<center>
						
								<p:commandButton value="Gravar" action="#{categoriaController.salvar}" update="categoriaForm" /> 
								
			                    <p:commandButton value="Alterar" action="#{categoriaController.alterar}" update="categoriaForm" />
									
								<p:commandButton type="reset" value="Limpar" />
						</center>
						
					</p:panel>			
				
				
				
				
				<p:panel id="painelConsulta" header="Lista de objetos cadastrados"
					style="text-align:left;width:700px;">


					<p:dataTable value="#{categoriaController.listCategoria}" id="tabela" emptyMessage="Nenhum registro encontrado" rowIndexVar="var"
						paginator="true" paginatorPosition="bottom" firstPageLinkLabel="Primeira" previousPageLinkLabel="Anterior"
						nextPageLinkLabel="Proxima" lastPageLinkLabel="ultima" rows="10" var="categoria" width="600">

						<p:column>
							<f:facet name="header">
								<h:outputText value="ID" />
							</f:facet>
							<h:outputText value="#{categoria.idCategoria}" styleClass="letra1" />
						</p:column>

						<p:column>
							<f:facet name="header">
								<h:outputText value="Nome" />
							</f:facet>
							<h:outputText value="#{categoria.nomeCategoria}" styleClass="letra1" />
						</p:column>

						<p:column>
							<f:facet name="header">
								<h:outputText value="Descricao" />
							</f:facet>
							<h:outputText value="#{categoria.descricaoCategoria}" styleClass="letra1" />
						</p:column>
						
						<p:column>
							<p:commandButton value="alterar" update="painelCadastro,painelConsulta">
								<f:setPropertyActionListener
									target="#{categoriaController.categoria}" value="#{categoria}" />
							</p:commandButton>
						</p:column>

						<p:column>
							<p:commandButton action="#{categoriaController.excluir}"
								value="excluir" update="painelConsulta" onclick="return confirm('Confirma Exclusão do Registro?')" >
								<f:setPropertyActionListener
									target="#{categoriaController.categoria}" value="#{categoria}" />
							</p:commandButton>
						</p:column>
						
					</p:dataTable>

				</p:panel></center>

			</h:form>
		</ui:define>
	</ui:composition>

</h:body>
</f:view>
</html>

OBS: se eu atualizo minha tela logo após o processo de save, o componente dataTable é atualizado com o novo registro.

Isto poderia ser algum problema do ajax do primefaces?

Obrigado pessoal…

Tenta

 <p:commandButton value="Gravar" action="#{categoriaController.salvar}" update="categoriaForm" ajax="false" />   

tenta

update=“categoriaForm:painelConsulta”

Se não der certo, coloca prependId false no form e tenta update=“painelConsulta”

Se ainda assim não der certo tenta setar o atributo widgetVar do panel como “painelConsulta”…

provavelmente o primeiro funcione…

Nenhuma das opções funcionou… e ainda descobri um outro problema… todas as vezes que eu aperto F5 pra executar um refresh na tela, é feita a ultima operação q eu realizei. Ex: se eu realizei um save, e apertei F5, pra ele renderizar os componentes, ele executa novamente o save no banco. Vou postar minha classe controller aqui…

@ManagedBean(name = "categoriaController")
@Scope("request")
@Controller
public class CategoriaController {
	
	
	private ICategoriaService categoriaService;
	private Categoria categoria;
	private List<Categoria> listCategoria = null;
	
	
	
	@Autowired
	public CategoriaController(ICategoriaService categoriaService){
		this.categoriaService = categoriaService;
		categoria = new Categoria();
		init();
	}

	public void init(){
		listCategoria = new ArrayList<Categoria>();
		try {
			listCategoria = categoriaService.findAll();
		} catch (ServiceException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * Limpa os campos input.
	 */
	private void atualizarTela() {
		categoria = new Categoria();
	}
	
	/**
	 * Grava novo registro ou atualiza um registro
	 * 
	 * @throws ServiceException
	 */
	public void salvar() {
		try {
			categoriaService.salvar(categoria);
			JsfUtil.addSuccessMessage(WebUtils.SAVE_OK);
		} catch (ServiceException e) {
			JsfUtil.addErrorMessage(WebUtils.SAVE_CANCEL);
		}
		atualizarTela();
	}
	
	/**
	 * Atualiza registro no banco
	 * 
	 * @throws ServiceException
	 */
	public void alterar(){
		try {
			categoriaService.atualizar(categoria);
			JsfUtil.addSuccessMessage(WebUtils.EDIT_OK);
		} catch (ServiceException e) {
			JsfUtil.addErrorMessage(WebUtils.EDIT_CANCEL);
		}
		atualizarTela();
	}
	
	/**
	 * Exclui um registro da tabela parametros
	 * @throws ServiceException
	 */
	public void excluir() {
		try {
			categoriaService.deletar(categoria);
			JsfUtil.addSuccessMessage(WebUtils.DELETE_OK);
		} catch (ServiceException e) {
			JsfUtil.addErrorMessage(WebUtils.DELETE_CANCEL);
		}
		atualizarTela();
	}



	public void setListCategoria(List<Categoria> listCategoria) {
		this.listCategoria = listCategoria;
	}

	public List<Categoria> getListCategoria() {
		return listCategoria;
	}

	public void setCategoria(Categoria categoria) {
		this.categoria = categoria;
	}

	public Categoria getCategoria() {
		return categoria;
	}

}

Bom, o que EU sempre faço em todo caso é dividir os forms. Deixo um form só para a tabela e dou um update no form… funciona em 100% das vezes… Mas não coloque um Form dentro do outro, separa em 2 ou mais sacou?

seu form tem id ?? se sim tente usar update=“nomeDoForm:tabela”

Separei o código agora em 2 forms, como sugerido, porém ainda continua com este problema… agora estou com um outro problema também que é o que eu listei acima… quando aperto F5 para atualizar a página, ele executa a operação que foi selecionada anteriormente. Voçês sabem o que pode ter causado isso também.

Obrigado.

Após separar os forms você deu update NO FORM ao invés de dar update na tabela?

Se sim, eu não não tenho nem ideia do que pode ser, uso Prime diariamente e essa medida sempre funcionou…

De qualquer forma, se mesmo assim não funcionou… você realmente precisa do ajax? Porque se não precisar da um ajax=“false” no botão e pronto…

Pelo que eu estou vendo o ( ID ) do seu DATATABLE é TABELA, por isso que não está funcionando, no seu commandButton tem que conter isso: update=":tabela". Voc^pose até acrescentar mais, como por exemplo: <p:commandButton update=":id_FORM:id_DATATABLE:is_PANEL"/>.

Espero ter ajudado!!!