Como modelar classes/tabelas Cliente Pessoa Física e Cliente Pessoa Jurídica (usando Hibernate)

4 respostas
mcardinale

Oi, Pessoal.

Preciso modelar classes e tabelas para “cliente”, que pode ser “pessoa_fisica” ou “pessoa_juridica”. Estou usando Hibernate.

Algo do tipo:

class cliente {
    private String nome; 
    private pessoa pessoa; 
}   
class pessoa {  
    private int id;//não sei que atributos colocar aqui. talvez o tipo de pessoa          
}
class pessoa_fisica extends pessoa {  
    private String cpf;          
}
class pessoa_juridica extends pessoa {  
    private String cnpj;  
}

Minhas dúvidas são:

  • como fazer esses relacionamentos no Hibernate?
  • como saber que tipo de cliente eu tenho, se é PJ ou PF?
  • quando for criar um cliente, primeiro vou ter que criar uma “pessoa” e depois o cliente? tipo pessoa p = new pessoa_fisica(); cliente c = new cliente§;?

Desculpem se estou sendo repetitivo aqui no fórum, mas já li vários tópicos aqui sobre isso mas não consegui chegar a uma conclusão de como fazer.

Muito obrigado!

Marcos

4 Respostas

R

Aqui tenho minha opinião a respeito:
http://www.tectura.com.br/topics/arquitetura_pessoa_fisica_e_pessoa_juridica

Mas ainda não pude colocar em prática. Também gostaria de ouvir outras opiniões.

CintiaDR

Marcos,

existem mil e uma maneiras de preparar sua encomenda. Uma das minhas preferidas é a que foi sugerida:

class Cliente {
    private int id; 
    private String nome; 
    private Pessoa pessoa; 
}   
interface Pessoa {  
  //metodos que vc quer chamar
}

class PessoaFisica implements pessoa {  
    private int id; 
    private String cpf;          
}
class PessoaJuridica implements pessoa {  
    private int id; 
    private String cnpj;  
}

Outra seria:

class Cliente {
    enum Tipo {FISICA, JURIDICA};

    private int id; 
    private String nome; 
    private String identificador; 
}

Para fazer os mapeamentos é o de sempre. Quer dizer, comece e depois a gente dá uma ajuda nas dúvidas pontuais.

No primeiro caso, seria só fazer:

if (pessoa instanceof PessoaJuridica){ // whateva. }

Ou então implementar os métodos dentro das duas pessoas.

No segundo caso, tem um campo pra isso.

Sim.

Cliente meuCliente = new Cliente(); Pessoa p = new PessoaJuridica(); meuCliente.setPessoa(p);

mcardinale

Olá.
Muito obrigado pela resposta.
Eu devo fazer 3 tabelas (cliente, pessoa_fisica e pessoa_juridica) ou 4 tabelas (cliente, pessoa, pessoa_fisica e pessoa_juridica) como no meu modelo?
Acho que são 3, mas fiquei em dúvida agora, por causa do mapeamento.
Obrigado.
Marcos

CintiaDR

Marcos,

Se vc fizer Pessoa como interface, não deve fazer uma classe para ela.

Se você fizer Pessoa como superclasse, você pode OU NÃO criar uma tabela para pessoa.
http://gfronza.blogspot.com/2007/09/herana-simples-com-hibernate.html

Criado 22 de setembro de 2010
Ultima resposta 23 de set. de 2010
Respostas 4
Participantes 3