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
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.
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);
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
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