Problema com Herança!

Bom dia a todos, venho por meio deste tópico solicitar uma ajuda que não entendo o porque não está dando certo.

Possuo uma Entidade Pessoa, e nessa entidade Pessoa possui vinculado PessoFisica e PessoaJuridica, até ai tudo certo, a Entidade PessoaFisica e PessoaJuridica possui alguns atributos a mais, como CPF, NOME, RG, CNPJ, etc.

O meu problema é, quando eu vou buscar na minha tela de cadastro, eu buscaria por #{pessoaBean.pessoa.nome}, porém o atributo NOME, RG, CPF, e outros, não aparece.

Caso vocês saibam como me ajudar eu agradeceria muito.

Segue abaixo os códigos.

PessoaBean

[code]/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */
    package br.com.estagio.bean;

import br.com.estagio.ejb.PessoaFacade;
import br.com.estagio.ejb.PessoaFisicaFacade;
import br.com.estagio.ejb.PessoaJuridicaFacade;
import br.com.estagio.entidades.Pessoa;
import br.com.estagio.entidades.PessoaFisica;
import br.com.estagio.entidades.PessoaJuridica;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

/**
*

  • @author Luis
    */
    @ManagedBean
    @SessionScoped
    public class PessoaBean {

    private Pessoa pessoa = new Pessoa();
    @EJB
    private PessoaFacade pessoaFacade;
    @EJB
    private PessoaFisicaFacade pessoaFisicaFacade;
    @EJB
    private PessoaJuridicaFacade pessoaJuridicaFacade;
    private List listaF = new ArrayList();
    private List listaJ = new ArrayList();
    private Pessoa selectPessoa;

    public void novoFisica() {
    pessoa = new PessoaFisica();

    }

    public void novoJuridica() {
    pessoa = new PessoaJuridica();

    }

    public String salvar() {
    if (pessoa.getId() != null) {
    pessoaFacade.alterar(pessoa);
    } else {
    pessoaFacade.save(pessoa);
    }
    FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, “Pessoa cadastrado(a) com sucesso.”, “”);
    FacesContext.getCurrentInstance().addMessage(null, message);
    return “list”;
    }

    public void excluir(javax.faces.event.ActionEvent a) {
    try {
    pessoaFacade.remove((Pessoa) a.getComponent().getAttributes().get(“pessoa”));
    FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, “Pessoa excluida com sucesso.”, “”);
    FacesContext.getCurrentInstance().addMessage(null, message);
    } catch (Exception e) {
    FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, “Falha ao excluir pessoa.”, “”);
    FacesContext.getCurrentInstance().addMessage(null, message);
    }
    }

    public void editar(ActionEvent e) {
    pessoa = (Pessoa) e.getComponent().getAttributes().get(“pessoa”);
    }

    public Pessoa getSelectPessoa() {
    return selectPessoa;
    }

    public void setSelectPessoa(Pessoa selectPessoa) {
    this.selectPessoa = selectPessoa;
    }

    public Pessoa getPessoa() {
    return pessoa;
    }

    public void setPessoa(Pessoa pessoa) {
    this.pessoa = pessoa;
    }

    public PessoaFacade getPessoaFacade() {
    return pessoaFacade;
    }

    public void setPessoaFacade(PessoaFacade pessoaFacade) {
    this.pessoaFacade = pessoaFacade;
    }

    public PessoaFisicaFacade getPessoaFisicaFacade() {
    return pessoaFisicaFacade;
    }

    public void setPessoaFisicaFacade(PessoaFisicaFacade pessoaFisicaFacade) {
    this.pessoaFisicaFacade = pessoaFisicaFacade;
    }

    public PessoaJuridicaFacade getPessoaJuridicaFacade() {
    return pessoaJuridicaFacade;
    }

    public void setPessoaJuridicaFacade(PessoaJuridicaFacade pessoaJuridicaFacade) {
    this.pessoaJuridicaFacade = pessoaJuridicaFacade;
    }

    public List getListaF() {
    return pessoaFisicaFacade.findAll();
    }

    public void setListaF(List listaF) {
    this.listaF = listaF;
    }

    public List getListaJ() {
    return pessoaJuridicaFacade.findAll();
    }

    public void setListaJ(List listaJ) {
    this.listaJ = listaJ;
    }

}
[/code]

Entidade Pessoa

[code]/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */
    package br.com.estagio.entidades;

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

/**
*

  • @author Luis
    */
    @Entity
    public class Pessoa implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String endereco;
    private Integer numero;
    private String complemento;
    private String bairro;
    private String cidade;
    private String estado;
    private Integer cep;
    private Integer telefone;
    private Integer celular;
    private Integer fax;
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date dataCadastro;
    private String email;
    private String observacoes;

    public String getEndereco() {
    return endereco;
    }

    public void setEndereco(String endereco) {
    this.endereco = endereco;
    }

    public Integer getNumero() {
    return numero;
    }

    public void setNumero(Integer numero) {
    this.numero = numero;
    }

    public String getComplemento() {
    return complemento;
    }

    public void setComplemento(String complemento) {
    this.complemento = complemento;
    }

    public String getBairro() {
    return bairro;
    }

    public void setBairro(String bairro) {
    this.bairro = bairro;
    }

    public String getCidade() {
    return cidade;
    }

    public void setCidade(String cidade) {
    this.cidade = cidade;
    }

    public String getEstado() {
    return estado;
    }

    public void setEstado(String estado) {
    this.estado = estado;
    }

    public Integer getCep() {
    return cep;
    }

    public void setCep(Integer cep) {
    this.cep = cep;
    }

    public Integer getTelefone() {
    return telefone;
    }

    public void setTelefone(Integer telefone) {
    this.telefone = telefone;
    }

    public Integer getCelular() {
    return celular;
    }

    public void setCelular(Integer celular) {
    this.celular = celular;
    }

    public Integer getFax() {
    return fax;
    }

    public void setFax(Integer fax) {
    this.fax = fax;
    }

    public Date getDataCadastro() {
    return dataCadastro;
    }

    public void setDataCadastro(Date dataCadastro) {
    this.dataCadastro = dataCadastro;
    }

    public String getEmail() {
    return email;
    }

    public void setEmail(String email) {
    this.email = email;
    }

    public String getObservacoes() {
    return observacoes;
    }

    public void setObservacoes(String observacoes) {
    this.observacoes = observacoes;
    }

    public Long getId() {
    return id;
    }

    public void setId(Long id) {
    this.id = id;
    }

    @Override
    public int hashCode() {
    int hash = 0;
    hash += (id != null ? id.hashCode() : 0);
    return hash;
    }

    @Override
    public boolean equals(Object object) {
    // TODO: Warning - this method won’t work in the case the id fields are not set
    if (!(object instanceof Pessoa)) {
    return false;
    }
    Pessoa other = (Pessoa) object;
    if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
    return false;
    }
    return true;
    }

    @Override
    public String toString() {
    return id.toString();
    }

}
[/code]

Entidade PessoaFisica

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.estagio.entidades;

import java.io.Serializable;
import javax.persistence.Entity;

/**
 *
 * @author Luis
 */
@Entity
public class PessoaFisica extends Pessoa implements Serializable {
    
    private String nome;
    private String cpf;
    private String rg;

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getCpf() {
        return cpf;
    }

    public void setCpf(String cpf) {
        this.cpf = cpf;
    }

    public String getRg() {
        return rg;
    }

    public void setRg(String rg) {
        this.rg = rg;
    }
    
}

Entidade PessoaJuridica

[code]/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */
    package br.com.estagio.entidades;

import java.io.Serializable;
import javax.persistence.Entity;

/**
*

  • @author Luis
    */
    @Entity
    public class PessoaJuridica extends Pessoa implements Serializable {

    private String razaoSocial;
    private String nomeFantasia;
    private String cnpj;
    private String nomeResponsavel;

    public String getRazaoSocial() {
    return razaoSocial;
    }

    public void setRazaoSocial(String razaoSocial) {
    this.razaoSocial = razaoSocial;
    }

    public String getNomeFantasia() {
    return nomeFantasia;
    }

    public void setNomeFantasia(String nomeFantasia) {
    this.nomeFantasia = nomeFantasia;
    }

    public String getCnpj() {
    return cnpj;
    }

    public void setCnpj(String cnpj) {
    this.cnpj = cnpj;
    }

    public String getNomeResponsavel() {
    return nomeResponsavel;
    }

    public void setNomeResponsavel(String nomeResponsavel) {
    this.nomeResponsavel = nomeResponsavel;
    }

}
[/code]

Muito Obrigado.

Isso acontece por que os objetos da classe pai nunca sabem os métodos e atributos das classes filhas.
Uma solução seria você fazer a classe Pessoa ser abstrata e colocar métodos genéricos para os atributos específicos.
RG e IE são documentos estaduais, CPF e CNPJ são documentos federais, nome e razão social são nomes oficiais, apelido e nome fantasia são nomes opcionais e não formais. Entendeu?

[quote=drsmachado]Isso acontece por que os objetos da classe pai nunca sabem os métodos e atributos das classes filhas.
Uma solução seria você fazer a classe Pessoa ser abstrata e colocar métodos genéricos para os atributos específicos.
RG e IE são documentos estaduais, CPF e CNPJ são documentos federais, nome e razão social são nomes oficiais, apelido e nome fantasia são nomes opcionais e não formais. Entendeu?[/quote]

Para falar a verdade não, poderia explicar de um jeito mais simples? ou até com um exemplo? sou iniciante em programação e não possuo um entendimento muito bom, no mas muito obrigado pela resposta.