Selecionar item em um p:selectOneMenu e listar informações

tenho um p:selectOneMenu com o código abaixo:

<p:selectOneMenu effect="fade"  
                                     value="#{pacienteController.paciente.id_paciente}"
                                     style="height:20px; font-size: 13px; width: 250px " >                             

                        <f:selectItems value="#{pacienteController.listaPaciente()}"
                                       var="paciente"
                                       itemLabel="#{paciente.paciente}"
                                       itemValue="#{paciente.id_paciente}"/>
                    </p:selectOneMenu>

esse código faz carregar em p:selectOneMenu todos os pacientes cadastrados em meu banco de dados,
me mostra o nome do paciente e para gravar na tabela de agendamento o id do paciente, pois na tabela
de agendamento o paciente é chave estrangeira, então é necessário o id do paciente, ate aí tudo bem.

tenho também o código abaixa que carrega as informações do paciente na mesma tela:

                   <p:layout fullPage="false">                
                        <p:layoutUnit position="center">
                            <h:form prependId="reu" >

                                <h:outputText value="CPF:" 
                                              style="height:20px; font-size: 13px"/>
                                <h:outputText value="#{paciente.cpf}"
                                              style="height:20px; font-size: 13px"/><br/>

                                <h:outputText value="RG:" 
                                              style="height:20px; font-size: 13px"/>
                                <h:outputText  value="#{paciente.rg}"
                                               style="height:20px; font-size: 13px"/><br/>

                                <h:outputText value="Endereço:" 
                                              style="height:20px; font-size: 13px"/>
                                <h:outputText  value="#{paciente.endereco}"
                                               style="height:20px; font-size: 13px"/><br/>

                                <h:outputText value="Telefone:" 
                                              style="height:20px; font-size: 13px"/>
                                <h:outputText  value="#{paciente.telefone}"
                                               style="height:20px; font-size: 13px"/><br/>

                                <h:outputText value="Celular:" 
                                              style="height:20px; font-size: 13px"/>
                                <h:outputText  value="#{paciente.celular}"
                                               style="height:20px; font-size: 13px"/><br/>

                            </h:form>
                        </p:layoutUnit>
                    </p:layout>

o que eu quero fazer é o seguinte. No momento que eu selecionar um paciente pelo meu p:selectOneMenu
me traga as informações correspondente aquele paciente que eu selecionar.

aqui está minha classe pacienteController onde eu listo todos os pacientes e carrego no meu p:selectOneMenu somente o nome de todos os pacientes cadastrados na minha tabela paciente

public List<Paciente> listaPaciente() {
        List<Paciente> lista;
        lista = new PacienteDao().list();
        return lista;
    }

e aqui está o código da minha classe PacienteDao:

public List<Paciente> list() {
        Session ss = HibernateUtil.getSessionFactory().getCurrentSession();
        ss.beginTransaction();
        List lista = ss.createQuery("From paciente").list();
        ss.beginTransaction().commit();
        return lista;
    }

alguém poderia me ajudar nisso por favor?

Ao inves de vc pegar pelo ID, e ficar fazendo buscas, coloca direto o objeto paciente

[code]<p:selectOneMenu effect=“fade"
value=”#{pacienteController.paciente}"
style="height:20px; font-size: 13px; width: 250px " >

                    <f:selectItems value="#{pacienteController.listaPaciente()}"  
                                   var="paciente"  
                                   itemLabel="#{paciente.paciente}"  
                                   itemValue="#{paciente}"/>  
                </p:selectOneMenu>  [/code]

Ai qualquer lugar que vc pegar paciente.nome, paciente.idade, já vai estar pegando do objeto paciente selecionado

não sei se você conseguiu entender meu código, mas aqui: [code]<p:selectOneMenu effect=“fade"
value=”#{agendamentoController.agendamento.id_paciente}"
style="height:20px; font-size: 13px; width: 250px " >

                    <f:selectItems value="#{pacienteController.listaPaciente()}"
                                   var="paciente"
                                   itemLabel="#{paciente.paciente}"
                                   itemValue="#{paciente.id_paciente}"/>
                </p:selectOneMenu>[/code]

é o código que faz a inserção no banco, pra fazer aproveitamento, eu queria já selecionar o paciente e simplesmente mostrar pro usuário algumas informações desse paciente aqui nesse código:

<p:layout fullPage="false">                  
     <p:layoutUnit position="center">  
         <h:form prependId="reu" >  
  
             <h:outputText value="CPF:"   
                           style="height:20px; font-size: 13px"/>  
             <h:outputText value="#{paciente.cpf}"  
                           style="height:20px; font-size: 13px"/><br/>  
  
             <h:outputText value="RG:"   
                           style="height:20px; font-size: 13px"/>  
             <h:outputText  value="#{paciente.rg}"  
                            style="height:20px; font-size: 13px"/><br/>  
  
             <h:outputText value="Endereço:"   
                           style="height:20px; font-size: 13px"/>  
             <h:outputText  value="#{paciente.endereco}"  
                            style="height:20px; font-size: 13px"/><br/>  
  
             <h:outputText value="Telefone:"   
                           style="height:20px; font-size: 13px"/>  
             <h:outputText  value="#{paciente.telefone}"  
                            style="height:20px; font-size: 13px"/><br/>  
  
             <h:outputText value="Celular:"   
                           style="height:20px; font-size: 13px"/>  
             <h:outputText  value="#{paciente.celular}"  
                            style="height:20px; font-size: 13px"/><br/>  
  
         </h:form>  
     </p:layoutUnit>  
</p:layout>  

e o que eu vou inserir será realmente o id_paciente pelo fato de ser chave estrangeira na tabela de agendamento.

Eu entendi sim…

Mas na sua entidade de Agendamento, vc deve ter um

private Paciente paciente; certo?

ao invés de algo do tipo

private Long id_paciente;


De qualquer forma, se vc quer tanto o id do paciente, é só pegar o paciente.getId();

Voce tentou implementar a idéia que te passei?

sim, eu tentei sim, mas sem sucesso.

e com esse seu código no momento que clico no meu botão salvar, ele não insere o id_paciente na tabela de agendamento.

eu não teria que colocar pra listar os dados do paciente em algum evento tipo “selected alguma coisa” do meu p:selectOneMenu?

Porque daí cada vez que eu selecionar um paciente, ele vai fazer a busca no banco de dados e me trazer as informações daquele paciente que eu selecionei…

mas sera que existe algum evento no p:selectOneMenu que me faça isso?

Por isso que eu disse pra vc pegar direto o objeto no campo value do selectOneMenu… ai conforme vc vai alterando, seu objeto já vai alterando junto… com isso, qualquer label ou inputText que tiver na tela referenciando esse objeto (#{paciente.nome}), ja vai ser automaticamente alterado. Com isso vc nao precisa fazer busca nenhuma…

Trabalhe com objetos e não com IDs + busca…
Repetindo… na sua entidade de Agendamento, vc deve ter um atributo com referencia ao objeto Paciente, e não um Long id, por exemplo…

Exemplo:

@Entity
public class Agendamento {

   @Id
   @GeneratedValue
   private Long id;

   @Column(name = "DATA_AGENDAMENTO")
   private Date dataAgendamento

   @ManyToOne
   private Paciente paciente;

}

aqui está o minha classe Agendamento:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.clinica.model;

import java.io.Serializable;
import java.sql.Time;
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Temporal;

@Entity(name = "agendamento")
public class Agendamento implements Serializable {

    @Id
    @GeneratedValue
    private Long id_agendamento;
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date dt_agendamento;
    private Long id_paciente;
    private Long id_medico;
    private String status_agendamento;
    private Time hora_agendamento;
    private String tp_agendamento;
    private String observacao;
    private Long id_plano;

    public Long getId_agendamento() {
        return id_agendamento;
    }

    public void setId_agendamento(Long id_agendamento) {
        this.id_agendamento = id_agendamento;
    }

    public Date getDt_agendamento() {
        return dt_agendamento;
    }

    public void setDt_agendamento(Date dt_agendamento) {
        this.dt_agendamento = dt_agendamento;
    }

    public Long getId_paciente() {
        return id_paciente;
    }

    public void setId_paciente(Long id_paciente) {
        this.id_paciente = id_paciente;
    }

    public Long getId_medico() {
        return id_medico;
    }

    public void setId_medico(Long id_medico) {
        this.id_medico = id_medico;
    }

    public String getStatus_agendamento() {
        return status_agendamento;
    }

    public void setStatus_agendamento(String status_agendamento) {
        this.status_agendamento = status_agendamento;
    }

    public Time getHora_agendamento() {
        return hora_agendamento;
    }

    public void setHora_agendamento(Time hora_agendamento) {
        this.hora_agendamento = hora_agendamento;
    }

    public String getTp_agendamento() {
        return tp_agendamento;
    }

    public void setTp_agendamento(String tp_agendamento) {
        this.tp_agendamento = tp_agendamento;
    }    

    public String getObservacao() {
        return observacao;
    }

    public void setObservacao(String observacao) {
        this.observacao = observacao;
    }

    public Long getId_plano() {
        return id_plano;
    }

    public void setId_plano(Long id_plano) {
        this.id_plano = id_plano;
    }
    
    
}

e aqui está minha classe completa PacienteController

package br.com.clinica.controller;

import br.com.clinica.dao.CidadeDao;
import br.com.clinica.dao.PacienteDao;
import br.com.clinica.dao.InterfacePaciente;
import br.com.clinica.model.Paciente;
import java.awt.event.ActionEvent;
import java.text.ParseException;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.event.AjaxBehaviorEvent;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import org.primefaces.context.RequestContext;

@ManagedBean
@SessionScoped
public class PacienteController {

    private Paciente paciente;
    private DataModel listaPaciente; 

    public PacienteController() {
        this.paciente = new Paciente();
        this.paciente.setCarteirinha_emitida("SIM");
        this.paciente.setCobranca_empresa("SIM");
       
    }   

    public Paciente getPaciente() {
        if (this.paciente == null) {
            this.paciente = new Paciente();
        }
        return paciente;
    }

    public void setPaciente(Paciente paciente) {
        this.paciente = paciente;
    }
    
    public List<Paciente> listaPaciente() {
        List<Paciente> lista;
        lista = new PacienteDao().list();
        return lista;
    }

    public DataModel getListaPaciente() {
        List<Paciente> lista = new PacienteDao().list();
        listaPaciente = new ListDataModel(lista);        
        return listaPaciente;
    }

    public void prepararAdicionarPaciente(ActionEvent actionEvent) {
        paciente = new Paciente();
    }

    public void prepararAlterarPaciente(ActionEvent actionEvent) {
        paciente = (Paciente) (listaPaciente.getRowData());
    }

    public void adicionar(ActionEvent actionEvent) throws ParseException {
        InterfacePaciente dao = new PacienteDao();
        dao.salvar(paciente);

    }

    public String excluir() {
        Paciente paciente = (Paciente) (listaPaciente.getRowData());
        InterfacePaciente dao = new PacienteDao();
        dao.remover(paciente);
        return "paciente";
    }

    public void clear(AjaxBehaviorEvent event) {
        this.paciente = null;
    }

    public void reset() {
        RequestContext.getCurrentInstance().reset("form:dialog");
    }

    public void atualizarPaciente() {
        InterfacePaciente dao = new PacienteDao();
        dao.atualizar(paciente);
        RequestContext.getCurrentInstance().closeDialog(paciente);
    }

    public String carregarPaciente(Paciente p) {
        paciente = p;
        return "pacienteAlterar";
    }

    public void choosePaciente() {
        this.prepararAlterarPaciente(null);
        RequestContext.getCurrentInstance().openDialog("pacienteAlterar");
    }
}

porém tentei usar o código que você me passou, mas não deu certo não.

Era isso q eu estava falando que vc não deveria ter feito…

[quote]private Long id_paciente;
private Long id_medico; [/quote]

Use objetos!

mas você fala pra mim alterar toda minha classe Agendamento?

Seria o certo… mas lembre que vc precisa de conhecimentos básicos de mapeamentos jpa como @OneToMany, @ManyToOne, @ManyToMany, e vai precisar alterar boa parte do seu sistema…

humm… isso que vai f… não sei como fazer isso… não teria como você alterar meu código pra mim ter como exemplo??

ou então não existe uma maneira mais simples pra adaptar no meu código?

[quote]humm… isso que vai f… não sei como fazer isso… não teria como você alterar meu código pra mim ter como exemplo??

ou então não existe uma maneira mais simples pra adaptar no meu código?[/quote]

Ai é pedir de mais né…
Mas faça o seguinte… no seu ManagedBean… crie (vi que vc ja tem, mas não seu pra que vc usa) uma variavel do tipo Paciente, ai la no seu value do selectOneMenu, e lá onde vc pega os dados, aponta tudo pra esse objeto…

desculpa pedir demais… fiz dessa maneira:

meu ManagedBean

@ManagedBean
@SessionScoped
public class AgendamentoController {   
    
    private Paciente paciente;

    public Paciente getPaciente() {
        return paciente;
    }

    public void setPaciente(Paciente paciente) {
        this.paciente = paciente;
    }
}

e no meu selectOneMenu esse código:

<p:selectOneMenu effect="fade"  
                                     value="#{agendamentoController.paciente}"
                                     style="height:20px; font-size: 13px; width: 250px " >                             

                        <f:selectItems value="#{pacienteController.listaPaciente()}"
                                       var="paciente"
                                       itemLabel="#{paciente.paciente}"
                                       itemValue="#{paciente}"/>
                    </p:selectOneMenu>

mas mesmo assim ainda não funcionou…
o que será que estou fazendo de errado?

ninguém mais?

Use setPropertyActionListener passa como parametro o id e depois recupera e busca no banco.
Não é a melhor solução mas vai funcionar!

Procure por converter, existe um milhão de exemplos, e pelo que eu entendi é o que você precisa.