Problema com Herança!

2 respostas
syncel

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

/*
 * 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<PessoaFisica> listaF = new ArrayList<PessoaFisica>();
    private List<PessoaJuridica> listaJ = new ArrayList<PessoaJuridica>();
    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<PessoaFisica> getListaF() {
        return pessoaFisicaFacade.findAll();
    }

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

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

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

Entidade Pessoa

/*
 * 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();
    }
    
}

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

/*
 * 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;
    }
    
}

Muito Obrigado.

2 Respostas

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?

syncel

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?

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.

Criado 29 de maio de 2013
Ultima resposta 29 de mai. de 2013
Respostas 2
Participantes 2