Carregar Dados do banco com hibernate + jsf + primefaces

Pessoal estou com um problema aki, estou fazendo um ecommerce com jpa + jsf + hibernate + primefaces.

Já tentei de várias formas mas sem sucesso. Eu tenho uma tabela com dados do banco, qdo clico no botão editar era para aparecer os dados daquele registro nos seus respectivos campos só que não aparece. Onde está o erro?
Já procurei em vários lugares mas nada deu certo pro meu caso. Abaixo está o código .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">

<ui:composition template="/Layout/Template.xhtml"
                xmlns="http://www.w3.org/1999/xhtml"
                xmlns:h="http://xmlns.jcp.org/jsf/html"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:f="http://java.sun.com/jsf/core"
                xmlns:p="http://primefaces.org/ui">
    <ui:define name="conteudo">
        <h:body>
            <h:form style="border: #999999;">
                <p></p>
                <p:commandButton id="btnAbrirCadastroCliente" value="Abrir Cadastro" immediate="true" oncomplete="cadastrarCliente.show()"/>
            </h:form>
            <h:form id="formListar" style="border: #999999;">
                <p:dataTable id="tabela" selectionMode="single" selection="#{clienteBean.cliente}" rowKey="#{cli.id}" value="#{clienteBean.clientes}" var="cli" emptyMessage="Nenhum registro incluido." paginator="true" rows="10">
                    <f:facet name="header">
                        LISTA DE CLIENTES
                    </f:facet>
                    <p:column headerText="NOME" style="text-align: center">
                        <h:outputText value="#{cli.nome}" />
                    </p:column>
                    <p:column headerText="ENDEREÇO" style="text-align: center">
                        <h:outputText value="#{cli.endereco}" />
                    </p:column>
                    <p:column headerText="TELEFONE" style="text-align: center">
                        <h:outputText value="#{cli.telefone}" />
                    </p:column>
                    <p:column headerText="FAX" style="text-align: center">
                        <h:outputText value="#{cli.fax}" />
                    </p:column>
                    <p:column headerText="E-MAIL" style="text-align: center">
                        <h:outputText value="#{cli.email}" />
                    </p:column>
                    <p:column headerText="ALTERAR - EXCLUIR" style="text-align: center">
                        <p:commandButton action="#{clienteBean.recuperarCliente}" value="EDITAR" title="Editar" onclick="alterarCliente.show(); return false" update="alterar" immediate="true"/>
                        <p:commandButton value="EXCLUIR" title="Excluir" onclick="confirmation.show()" style="margin-left: 5px" >
                            <f:setPropertyActionListener value="#{cli}" target="#{clienteBean.cliente}" />
                        </p:commandButton>
                    </p:column>
                </p:dataTable>
            </h:form>
            <h:form id="dlg">
                <p:confirmDialog message="Deseja realmente excluir este registro?" hideEffect="explode" header="Aviso" severity="alert" widgetVar="confirmation">
                    <p:commandButton id="btnSim" value="Sim" oncomplete="confirmation.hide();" actionListener="#{clienteBean.excluir}" update=":formListar:tabela"/>
                    <p:commandButton id="btnNao" value="Não" onclick="confirmation.hide();" type="button"/>
                </p:confirmDialog>
            </h:form>
            
            <p:dialog id="modalDialog" width="600" resizable="no" widgetVar="cadastrarCliente" header="CADASTRAR CLIENTE" modal="true" height="600">
                <h:form id="formCadastroCliente">
                    <p:messages id="msgs" autoUpdate="true"/>
                    <h:panelGrid columns="2" cellpadding="4">
                        <h:outputLabel value="Nome: *" for="nome"></h:outputLabel>
                        <p:inputText id="nome" label="nome" value="#{clienteBean.cliente.nome}" maxlength="200" required="true"/>
                        <p:message for="nome" display="icon"/>
                        <h:outputText value="" />
                            
                        <h:outputLabel value="Endereço: *" for="endereco"></h:outputLabel>
                        <p:inputText id="endereco" label="endereco" value="#{clienteBean.cliente.endereco}" maxlength="200" required="true"/>
                        <p:message for="endereco" display="icon"/>
                        <h:outputText value="" />
                            
                        <h:outputLabel value="CEP: *" for="cep"></h:outputLabel>
                        <p:inputText id="cep" label="cep" value="#{clienteBean.cliente.cep}" maxlength="10"/>
                            
                        <h:outputLabel value="Cidade: *" for="cidade"></h:outputLabel>
                        <p:inputText id="cidade" label="cidade" value="#{clienteBean.cliente.cidade}" maxlength="50" required="true"/>
                        <p:message for="cidade" display="icon"/>
                        <h:outputText value="" />
                            
                        <h:outputLabel value="Estado: *" for="estado"></h:outputLabel>
                        <p:inputText id="estado" label="estado" value="#{clienteBean.cliente.estado}" maxlength="2" required="true"/>
                        <p:message for="estado" display="icon"/>
                        <h:outputText value="" />
                            
                        <h:outputLabel value="Telefone:" for="telefone"></h:outputLabel>
                        <p:inputMask id="telefone" label="telefone" value="#{clienteBean.cliente.telefone}" maxlength="20" mask="(99)9999-9999"/>
                           
                        <h:outputLabel value="Celular:" for="celular"></h:outputLabel>
                        <p:inputMask id="celular" label="celular" value="#{clienteBean.cliente.celular}" maxlength="20" mask="(99)9999-9999"/>
                            
                        <h:outputLabel value="Fax:" for="fax"></h:outputLabel>
                        <p:inputMask id="fax" label="fax" value="#{clienteBean.cliente.fax}" maxlength="20" mask="(99)9999-9999"/>
                           
                        <h:outputLabel value="E-mail:" for="email"></h:outputLabel>
                        <p:inputText id="email" label="email" value="#{clienteBean.cliente.email}" maxlength="20" required="true">
                            <f:validator validatorId="emailValidator"/>
                        </p:inputText>
                            
                        <h:outputLabel value="Observação:" for="observacao"></h:outputLabel>
                        <p:inputTextarea id="observacao" label="observacao" value="#{clienteBean.cliente.observacao}"/>
                    </h:panelGrid>
                    <p:commandButton id="btnSalvar" value="SALVAR" actionListener="#{clienteBean.salvar}" update=":formListar:tabela" oncomplete="cadastrarCliente.hide()"/>
                    <p:commandButton id="btnCancelar" value="FECHAR" oncomplete="cadastrarCliente.hide()" update=":formListar:tabela"/>
                </h:form>
            </p:dialog>
            
            <p:dialog id="alterar" appendToBody="true" width="600" resizable="no" widgetVar="alterarCliente" header="ALTERAR CLIENTE" modal="true" height="600">
                <h:form prependId="false">
                    <p:messages id="msgs" autoUpdate="true"/>
                    <h:panelGrid columns="2" cellpadding="4" id="panel">
                        <h:outputLabel value="Nome: *" for="nome"></h:outputLabel>
                        <p:inputText id="nome" label="nome" value="#{clienteBean.cliente.nome}" maxlength="200" required="true"/>
                        <p:message for="nome" display="icon"/>
                        <h:outputText value="" />
                            
                        <h:outputLabel value="Endereço: *" for="endereco"></h:outputLabel>
                        <p:inputText id="endereco" label="endereco" value="#{clienteBean.cliente.endereco}" maxlength="200" required="true"/>
                        <p:message for="endereco" display="icon"/>
                        <h:outputText value="" />
                            
                        <h:outputLabel value="CEP: *" for="cep"></h:outputLabel>
                        <p:inputText id="cep" label="cep" value="#{clienteBean.cliente.cep}" maxlength="10"/>
                            
                        <h:outputLabel value="Cidade: *" for="cidade"></h:outputLabel>
                        <p:inputText id="cidade" label="cidade" value="#{clienteBean.cliente.cidade}" maxlength="50" required="true"/>
                        <p:message for="cidade" display="icon"/>
                        <h:outputText value="" />
                            
                        <h:outputLabel value="Estado: *" for="estado"></h:outputLabel>
                        <p:inputText id="estado" label="estado" value="#{clienteBean.cliente.estado}" maxlength="2" required="true"/>
                        <p:message for="estado" display="icon"/>
                        <h:outputText value="" />
                            
                        <h:outputLabel value="Telefone:" for="telefone"></h:outputLabel>
                        <p:inputMask id="telefone" label="telefone" value="#{clienteBean.cliente.telefone}" maxlength="20" mask="(99)9999-9999"/>
                           
                        <h:outputLabel value="Celular:" for="celular"></h:outputLabel>
                        <p:inputMask id="celular" label="celular" value="#{clienteBean.cliente.celular}" maxlength="20" mask="(99)9999-9999"/>
                            
                        <h:outputLabel value="Fax:" for="fax"></h:outputLabel>
                        <p:inputMask id="fax" label="fax" value="#{clienteBean.cliente.fax}" maxlength="20" mask="(99)9999-9999"/>
                           
                        <h:outputLabel value="E-mail:" for="email"></h:outputLabel>
                        <p:inputText id="email" label="email" value="#{clienteBean.cliente.email}" maxlength="20" required="true">
                            <f:validator validatorId="emailValidator"/>
                        </p:inputText>
                            
                        <h:outputLabel value="Observação:" for="observacao"></h:outputLabel>
                        <p:inputTextarea id="observacao" label="observacao" value="#{clienteBean.cliente.observacao}"/>
                    </h:panelGrid>
                    <p:commandButton id="btnSalvar" value="ALTERAR" actionListener="#{clienteBean.editar}" update=":formListar:tabela" oncomplete="alterarCliente.hide()"/>
                    <p:commandButton id="btnCancelar" value="FECHAR" oncomplete="alterarCliente.hide()" update=":formListar:tabela"/>
                </h:form>
            </p:dialog>
        </h:body>
    </ui:define>
</ui:composition>

Logo abaixo está o método recuperaCliente:

public void recuperarCliente(){
        cliente = new ClienteDao().getById(cliente.getId());
    }

Abaixo o método getById:

public Cliente getById(Serializable id) {
        try {
            return (Cliente) HibernateUtil.getSessionFactory().openSession().load(Cliente.class, id);
        } catch (HibernateException hibernateException) {
            throw hibernateException;
        }
    }

Alguma sugestão do erro?

Bom dia,

Vou te fazer uma pergunta que pode parecer trivial, mas pode te ajudar. Você já tentou fazer um Debug para ver se o método #{clienteBean.recuperarCliente} está sendo chamado quando você clica no Botão EDITAR?

Eu mudei o meu commandButton do botão editar para:

<p:commandButton actionListener="#{clienteBean.recuperarCliente}" value="EDITAR" title="Editar" onclick="alterarCliente.show(); return false" update="@(alterar:panel)" immediate="true"/>

E o meu método na classe bean está assim:

public void recuperarCliente(Cliente c){
        this.cliente = c;
    }

Debuguei e não entra no método ao clicar no botão editar.

Alguma sugestão?

Quando você declara

em clienteBean é esperado que tenha um método com essa assinatura:

public void recuperarCliente(ActionEvent event){ }
Para editar o cliente você deve passa-lo como parametro.
Aqui tem um link com 4 maneiras diferentes:
http://www.mkyong.com/jsf2/4-ways-to-pass-parameter-from-jsf-page-to-backing-bean/

Utilizei a quarta forma do link que vc me passou.
Abaixo está o codigo do botão:

<p:commandButton action="#{clienteBean.recuperarCliente}" value="EDITAR" title="Editar" onclick="alterarCliente.show(); return false" update="@(alterar:panel)" immediate="true">
                            <f:setPropertyActionListener target="#{cli}" value="editar"/>
                        </p:commandButton>

Abaixo o método recuperarCliente:

public void recuperarCliente(Cliente c){
        this.cliente = c;
    }

Mas não dá certo, o que está errado?

Você entendeu errado como funciona o setPropertyActionListener.
Target(alvo): Seu alvo ( pareço tradutor de livro, haha), para onde está sua mira! É a propriedade que receberá o valor. Nesse seu caso é o clienteBean.cliente. Precisa de um get/set para ele.
value(valor): O valor que você passará para o seu alvo(target). Se no seu datable o var declarado é cli, como é ele que você quer editar, o cli(objeto cliente), então você coloca “#{cli}” em value.

<f:setPropertyActionListener target="#{clienteBean.cliente}" value="#{cli}"/> 

obs 1: Ele não colocou “#{}” nos exemplos pois está passando apenas simples strings.
obs 2: Não precisa do " return false" no seu onclick e é provável que de algum problema por ele estar ali.
obs 3: Nem do immediate=“true”. Você utiliza isso quando tem um botão dentro de um form que tenha campos obrigatórios mas não quer que esses campos sejam validados.

Agora o código do botão está assim:

<p:commandButton action="#{clienteBean.recuperarCliente}" value="EDITAR" title="Editar" onclick="alterarCliente.show()" update="@(alterar:panel)">
                            <f:setPropertyActionListener target="#{clienteBean.cliente}" value="#{cli}"/>
                        </p:commandButton>

Mas não está funcionando!!

E como está o método recuperarCliente?

Assim:

public void recuperarCliente(Cliente c){  
        this.cliente = c;  
    }  

Cara, olha bem o 4º exemplo do site. É assim que tá?

Então agora acho que está certo. Mas como vou setar o valor do cliente sem a passagem de parâmetro. Eu sei que a pergunta pode ser idiota mas é que estou aprendendo agora a mexer em jpa+jsf+hibernate. Abaixo está o código da classe clienteBean:

@ManagedBean
@SessionScoped
public class ClienteBean implements Serializable{
    
    private Cliente cliente = new Cliente();
    private List clientes = new ArrayList();
    private UIForm form;
    
    public ClienteBean(){
        clientes = new ClienteDao().listar();
        cliente = new Cliente();
    }
    
    public void salvar(ActionEvent event) {
        new ClienteDao().inserir(cliente);
        clientes = new ClienteDao().listar();
        cliente = new Cliente();
    }
 
    public void recuperarCliente(){
        this.cliente = cliente;
    }
    
    public void editar() {
        new ClienteDao().alterar(cliente);
        clientes = new ClienteDao().listar();
        cliente = new Cliente();
    }
 
    public void excluir() {
        //dao.delete(cliente);
        //clientes = dao.consultar();
        new ClienteDao().delete(cliente);
        clientes = new ClienteDao().listar();
        cliente = new Cliente();
    }
 
    public Cliente getCliente() {
        return cliente;
    }
 
    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }
 
    public List getClientes() {
        return clientes;
    }
 
    public void setClientes(List clientes) {
        this.clientes = clientes;
    }
}

Abaixo o commandbutton:

<p:commandButton action="#{clienteBean.recuperarCliente}" value="EDITAR" title="Editar" onclick="alterarCliente.show()" update="@(alterar:panel)">
                            <f:setPropertyActionListener target="#{clienteBean.cliente}" value="#{cli}"/>
                        </p:commandButton>

Alguma sugestão?