Dialog pega objeto sem id de datatable

Galera, tenho uma datable, ela é preenchida normalmente com todo o objeto. Uso um dialog para editar o objeto, só que na hora de editar da um erro dizendo que o objeto não é identificado. Debuguei e vir que o dialog pega o objeto sem o id. Andei pesquisando mas não conseguir resolver esse problema. Se alguém poder mim ajudar, agradeço.

Datable

 <h:form>
                    <p:dataTable id="tabela" emptyMessage="Nenhum dado encontrado" value="#{clienteMB.listar()}" var="cliente">



                        <p:column headerText="Nome">
                            <h:outputText value="#{cliente.nome}"/>
                        </p:column>

                        <p:column headerText="CPF">
                            <h:outputText value="#{cliente.cpf}"/>
                        </p:column>

                        <p:column headerText="RG">
                            <h:outputText value="#{cliente.rg}"/>
                        </p:column>

                        <p:column headerText="Estado">  
                            <h:outputText value="#{cliente.estado}"/>
                        </p:column>

                        <p:column headerText="Cidade">
                            <h:outputText value="#{cliente.cidade}"/>
                        </p:column>

                        <p:column headerText="Opções">
                            <p:commandButton icon="ui-icon-pencil" title="Editar" update="tabela" onclick="dlgEditar.show();">
                                <f:setPropertyActionListener target="#{clienteMB.clienteSelecionado}" value="#{cliente}"/>
                            </p:commandButton>

                            <p:commandButton  icon="ui-icon-trash" title="Apagar" ajax="false" update="tabela" actionListener="#{clienteMB.deletarCliente(cliente)}"/>
                            <h:outputLink value="conta.xhtml">
                                <p:button icon="ui-icon-clipboard" title="Abrir conta"/>
                            </h:outputLink>
                        </p:column>

                    </p:dataTable>
                </h:form>

Dialog:

<p:dialog widgetVar="dlgEditar" header="Editar Cliente" resizable="false" closable="false">
                    <h:form>
                        <p:panelGrid columns="2" style="margin-bottom:10px" >
                            <h:outputText value="Nome"/>
                            <p:inputText   value="#{clienteMB.clienteSelecionado.nome}"/>

                            <h:outputText value="CPF"/>
                            <p:inputText  value="#{clienteMB.clienteSelecionado.cpf}"/>

                            <h:outputText value="RG"/>
                            <p:inputText  value="#{clienteMB.clienteSelecionado.rg}"/>
                            
                            <h:outputText value="Estado: " />  
                            <p:inputText value="#{clienteMB.clienteSelecionado.estado}"/>  
                                    

                            <h:outputText value="Cidade"/>
                            <p:inputText  value="#{clienteMB.clienteSelecionado.cidade}"/>

                        </p:panelGrid>
                        <h:commandButton value="Salvar" actionListener="#{clienteMB.alterarCliente()}"/>
                        <h:commandButton value="Cancelar" onclick="dlgEditar.hide();"/>
                    </h:form>
                </p:dialog>

Rapaz,

Já tentou usar o evento oncomplete no lugar de onclick no seu commandButton de edição?

Já tentei muitassssss coisas, e até agora não deu certo, vou tentar isso ai pra ver…obrigado.

Mais alguém ai galera?, n sei mais o que fazer para resolver esse problema…!

No seu botão de editar coloque update="dlgEditar"

E para salvar a edição deve ser:

   <p:commandButton value="Salvar" actionListener="#{clienteMB.alterarCliente}"/>  


//no bean

public void alterarCliente(javax.faces.event.ActionEvent actionEvent){
   try{
			clienteDAO.alterar(clienteSelecionado);
		}catch(Exception e){
			e.printStackTrace();
		}
} 

Tente passar o id do objeto em uma coluna oculta do data table

Ezequiel, não sei se entendi o que você falou, mas o id do objeto está setado nada datatable, na hora que pego o objeto pelo dialog é que o objeto vem sem id…obrigado!
Erick fez desse jeito ai…continuou o mesmo erro…obrigado!

E ai Blz!

Como está a sua classe clienteMB ?

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controle;

import modelo.Cliente;
import dao.DaoCliente;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.bean.SessionScoped;

/**
 *
 * @author mixplick
 */

@RequestScoped
@ManagedBean


public class ClienteMB {
    
    private Cliente cliente = new Cliente();
    private DaoCliente daoCliente = new DaoCliente();
    private List<Cliente> listaCliente = new ArrayList<Cliente>();
    private Cliente clienteSelecionado = new Cliente();

    /**
     * @return the cliente
     */
    public Cliente getCliente() {
        return cliente;
    }

    /**
     * @param cliente the cliente to set
     */
    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    /**
     * @return the daoCliente
     */
    public DaoCliente getDaoCliente() {
        return daoCliente;
    }

    /**
     * @param daoCliente the daoCliente to set
     */
    public void setDaoCliente(DaoCliente daoCliente) {
        this.daoCliente = daoCliente;
    }

    /**
     * @return the listaCliente
     */
    public List<Cliente> getListaCliente() {
        return listaCliente;
    }

    /**
     * @param listaCliente the listaCliente to set
     */
    public void setListaCliente(List<Cliente> listaCliente) {
        this.listaCliente = listaCliente;
    }

    public Cliente getClienteSelecionado() {
        return clienteSelecionado;
    }

    public void setClienteSelecionado(Cliente clienteSelecionado) {
        this.clienteSelecionado = clienteSelecionado;
    }
    
    

   public void cadastrarCliente(){
       daoCliente.cadastrarCliente(cliente);
       this.cliente = null;
   }
    
   public List<Cliente> listar(){
       listaCliente = daoCliente.listarTudo();
       return listaCliente;
   }
   
   public void deletarCliente(Cliente c){
       this.cliente = c;
       daoCliente.removerCliente(cliente);
   }    
   
   public void alterarCliente(){
       daoCliente.alterarCliente(cliente);
   }
}

Testa assim, cria um método clienteSelecionado e passa o id do objeto a ser editado.
Exe:
Primeiro cria uma variável;

depois cria o método.

public void clienteSelecionado (){ this.idCliente = cliente.getIdCliente; }
ou assim

public String clienteSelecionado (){ this.idCliente = cliente.getIdCliente; return null; }