[RESOLVIDO] JSF Como fazer Chamada de método na página

Em uma classe main setando manualmente consigo persistir no banco que é uma beleza.

Acredito eu estar chamando o método de forma incorreta. Nem um erro se quer me é retornado…

Abaixo meu Bean

@ManagedBean
@SessionScoped
public class PacienteBean implements Serializable {
    
    private Paciente paciente = new Paciente();
    List <Paciente> pacientes = new ArrayList();
    private PacienteDao dao = new PacienteDaoImp();

    public PacienteBean() {
        pacientes = dao.consultar(); 
    }
    
    public void salvar(){
        dao.merge(paciente); 
        paciente = new Paciente(); 
        pacientes = dao.consultar(); 
    }
    
    public void editar(){
        paciente = dao.getById(paciente.getId()); 
    }
    
    public void deletar(){
        dao.delete(paciente); 
        pacientes = dao.consultar(); 
    }

    //getters & setters

    }
}

Minha view

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

    <ui:define name="conteudo">
        <h:form id="form">
            <p:panel header="Cadastro de Pacientes" id="panel">
                <h:panelGrid columns="2">
                    <h:outputLabel value="Nome:" for="nome"/>
                    <p:inputText id="nome" value="#{pacienteBean.paciente.nome}" maxlength="40" size="40"/>
                    <h:outputLabel value="E-mail:" for="email"/>
                    <p:inputText id="email" value="#{pacienteBean.paciente.email}" maxlength="40" size="40"/>
                    <h:outputLabel value="Rua: " for="rua"/>
                    <p:inputText id="rua" value="#{pacienteBean.paciente.endereco.rua}" maxlength="40" size="40"/>
                    <h:outputLabel value="Bairro:" for="bairro"/>
                    <p:inputText id="bairro" value="#{pacienteBean.paciente.endereco.bairro}" maxlength="40" size="40"/>
                    <h:outputLabel value="CEP:" for="cep"/>
                    <p:inputMask id="cep" value="#{pacienteBean.paciente.endereco.cep}" mask="99999-999" size="40"/>
                    <h:outputLabel value="Celular:" for="celular"/>
                    <p:inputMask id="celular" value="#{pacienteBean.paciente.celular}" mask="(99) 9999 - 9999" size="40"/>
                    <h:outputLabel value="CPF:" for="cpf"/>
                    <p:inputMask id="cpf" value="#{pacienteBean.paciente.cpf}" mask="999.999.999-99" size="40"/>
                    <h:outputLabel value="Data de Nascimento:" for="nascimento"/>
                    <p:calendar id="nascimento" value="#{pacienteBean.paciente.nascimento}" pattern="dd/mm/yyyy" size="40" effect="slideDown"/>
                    <p:commandButton id="btnSalvar" value="Salvar" action="#{pacienteBean.salvar()}" update="form, tabela"/>
                </h:panelGrid>
                <p:dataTable id="tabela" value="#{pacienteBean.pacientes}"  var="pac" emptyMessage="Nehum registro incluído" paginator="true" rows="10">
                    <f:facet name="header">
                        Lista de Pacientes
                    </f:facet>
                    <p:column headerText="Nome" style="text-align: center">
                        <h:outputText value="#{pac.nome}"/>
                    </p:column>
                    <p:column headerText="E-mail" style="text-align: center">
                        <h:outputText value="#{pac.email}"/>
                    </p:column>
                    <p:column headerText="Endereco" style="text-align: center">
                        <h:outputText value="#{pac.rua}"/>
                    </p:column>
                    <p:column headerText="Celular" style="text-align: center">
                        <h:outputText value="#{pac.celular}"/>
                    </p:column>
                    <p:column headerText="CPF" style="text-align: center">
                        <h:outputText value="#{pac.cpf}"/>
                    </p:column>
                    <p:column headerText="Nascimento" style="text-align: center">
                        <h:outputText value="#{pac.nascimento}"/>
                    </p:column>
                    <p:column headerText="Sexo" style="text-align: center">
                        <h:outputText value="#{pac.sexo}"/>
                    </p:column>
                </p:dataTable>
            </p:panel>
        </h:form>
    </ui:define>
</ui:composition>

qual erro aparece ?

O problema é este não aparece erro algum.

Quando voce usa EL, nao precisa colocar os parenteses, entao basta mudar o botão para

<p:commandButton id=“btnSalvar” value=“Salvar” action="#{pacienteBean.salvar}" update=“form” ajax=“false”/>

outra coisa, como voce irá submeter os dados do formulario para serem salvos, faça isso colocando a propriedade ajax no botão como false, e se não me engano, seu método precisa retornar uma String. Para manter o usuario na mesma pagina, coloque return null;

no update basta deixar o form já que a tabela fica dentro do form, todos serão atualizados.

Já tentou debugar? Ver se é chamado o método.

Hehe, concordo com o post acima!

acho que vc esqueceu do commit

algo assim:

  
    public void salvar(){  
        dao.merge(paciente);   
        dao.commit();
        paciente = new Paciente();   
        pacientes = dao.consultar();   
    }  

Segui as dicas da Mayara e ficou uma benção salvo uma excessão não precisei retornar nada no meu método. Está perfeito insiro na tabela mando salvar zera os campos e atualiza a tabela.

Só consegui isso depois de retirar os campos endereço, rua, cep, cidade, estado, que vinham de outras classes e tabelas diferentes no banco ou seja além de chamar o método incorretamente estava abusando da sorte com um mapeamento mal feito no hibernate.

Obrigado pela ajuda de todos!

[quote=Polverini]acho que vc esqueceu do commit

algo assim:

[code]

public void salvar(){  
    dao.merge(paciente);   
    dao.commit();
    paciente = new Paciente();   
    pacientes = dao.consultar();   
}  

[/code][/quote]

Meu bean implementa meu PacienteDaoImp que por sua vez extende DaoGenericoImp é nesta classe onde está todo o código do método merge inclusive abrindo, commit e fechando a transação. Não tem de aparecer no meu Bean por causa da OO que utilizei.

public T merge(T objeto) {
        try {
            Object obj = null;
            HibernateUtility.beginTransaction();
            obj = HibernateUtility.getSession().merge(objeto);
            HibernateUtility.commitTransaction();
            HibernateUtility.closeSession();
            return (T) obj;
        } catch (HibernateException hibernateException) {
            cancel();
            throw hibernateException;
        }
    }