Mapeamento Cliente/PessoaFisica/PessoaJuridica

Boa noite pessoal, estou com uma dúvida no mapemaneto de minhas classes

Como poderia fazer uma classe e o mapeamento da tabela cliente, sendo que um cliente pode ser pessoa fisica e juridica. Pensei em fazer a classe pessoa ser uma interface, mas não sei se seria possivel mapear para o banco.

Obrigado

Boa noite amigo.

Primeiramente, considere o seguinte esquema

[code]public class Pessoa {

int id;
String nome;
String telefone;

}

public class PessoaFisica extends Pessoa {

String RG;
String CPF;

}

public class PessoaJuridica extends Pessoa {

String CNPJ;
String inscricaoEstadual;

}
[/code]

Agora considere as três possibilidades de mapeamento das classes acima:

1 - Usando uma tabela por classe concreta, nesse caso você terá uma tabela PessoaFisica e uma tabela PessoaJuridica. Neste caso, os campos herdados de Pessoa estarão contidos em ambas as tabelas. Usando esse esquema é possível que uma Pessoa Fisica possua ID igual ao de uma Pessoa Juridica.

Portanto, PessoaFisica[id, nome, telefone, RG, CPF] e PessoaJuridica[id, nome, telefone, CNPJ, inscricaoEstadual].

2 - Usando um tabela para todas as classes, neste caso, você sempre terá campos vazios de acordo com a entidade. Por exemplo, ao salvar uma PessoaFisica os campos CNPJ e inscricaoEstadual ficarão vazio, e quando salvar uma PessoaJuridica os campos RG e CPF ficaram vazios. Usando esse esquema não e possível que uma Pessoa Fisica tenha ID igual ao de uma Pessoa Juridica.

Portanto, Pessoa[id, nome, telefone, RG, CPF, CNPJ, inscricaoEstadual, DTYPE]

OBS: O campo DTYPE é utilizado para identificar à qual classe pertence o registro em questão. O nome deste campo pode ser outro mas esse é o usualmente utilizado.

3 - Usando uma tabela por classe, nesse caso você terá uma tabela Pessoa[id, nome, telefone], uma PessoaFisica[idPessoa, RG, CPF] e uma PessoaJuridica[idPessoa, CNPJ, inscricaoEstadual]. Usando esse esquema não e possível que uma Pessoa Fisica tenha ID igual ao de uma Pessoa Juridica.

Observe nas tabelas PessoaFisica e PessoaJuridica a necessidade da chave estrangeira relacionada a tabela Pessoa.


Após mapear as classes, Pessoa, PessoaFisica e PessoaJuridica… você pode mapear o cliente da seguinte forma:

[code]public class Cliente {

int id;
Pessoa pessoa;
//outros atributos de cliente

}[/code]

Com isso, no BD você terá um relacionamento entre cliente e pessoa. Ficaria algo como Cliente[id, idPessoa, outrosAtributos]. Como o cliente tera uma chave estrangeira, idPessoa, relacionada a Pessoa aconselho a utilizar a estrategia 1 ou 2 dentre as apresentadas acima.

Bom, é isso cara. Espero que tenha ajudado.
Abraços.

Gilvan,
Obrigado pela resposta,
O mapemaneto no hibernate ficaria +/- assim??

//classe pessoa
@Entity
@Inheritance
@Table( name = "pessoa" )
@DiscriminatorColumn(name = "tipo_pessoa", discriminatorType = DiscriminatorType.STRING)  
public class Pessoa {
	
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column( name = "id" )
	private Long id;

classe pessoaFisica

@Entity
@DiscriminatorValue(value = "F")
public class PessoaFisica extends Pessoa {

	@Column(name = "nome")
	private String nome;

	@Column(name = "rg")
	private String rg;

Ai na classe cliente eu tenho uma Pessoa?

Obrigado
[]'s

É isso ai cara, mas aconselho também a utilizar na classe pessoa a anotação

@Inheritance(strategy= “AQUI VAI A ESTRATEGIA DESEJADA (ENTRE AQUELAS QUE FALEI ACIMA)” )

Da uma olhada nesses links

(em inglês): http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#d0e1168
Ele fala sobre estratégias de mapeamento, ± o que tentei te explicar ai em cima. Recomendo ler pois trata-se da documentação oficial.

(português) http://blog.caelum.com.br/jpa-com-hibernate-heranca-e-mapeamentos/
Fala sobre cuidados com a estratégia de mapeamento do tipo “JOINED”, usa como exemplo classes Pessoa, PessoaFisica e PessoaJuridica.

Abraços.

mto obrigado gilvan.sfilho pela ajuda,
se pintar outro problema posto aqui rsrs…

vlws
[]'s

Meus amigos,

Ja entendi como funciona esse @DiscriminatorValue, mais existe uma possibilidade de ultilizar o valor do @DiscriminatorValue em uma JSP por exemplo???

Abr,
Altair

pq vc usaria @DiscriminatorValue na JSP?

o @DiscriminatorValue deve ir na classe que você esta mapeando para ir p/ o BD…

Seguinte amigos vou tentar explicar,

Meu cliente tem um relacionamento de pessoa fisica e pessoa juridica parecido com o relacionamento acima. E eu usaria na JSP o @DiscriminatorValue para abrir o formulário.

Exemplo:

Se o @DiscriminatorValue for = ‘F’ eu vou mostrar o formulário de pessoa fisica com RG e CPF.

E se o @DiscriminatorValue = ‘J’ eu vou mostrar o formulário de pessoa Juridica com CNPJ e I.E e I.M.

Se isso não for possivel poderiam me ajudar em como fazer isso?

Abr,
Altair

Olá Amigos, sou novo aqui no fórum, e novo também na linguagem, aproveitei o tópico para pedir ajuda em relação
ao mapeamento dos objetos das classes mencionadas acima (pessoa/Fisica/Juridica).
Devo ter um DAO para cada classe?

Obrigado!

[quote=alltairr]Seguinte amigos vou tentar explicar,

Meu cliente tem um relacionamento de pessoa fisica e pessoa juridica parecido com o relacionamento acima. E eu usaria na JSP o @DiscriminatorValue para abrir o formulário.

Exemplo:

Se o @DiscriminatorValue for = ‘F’ eu vou mostrar o formulário de pessoa fisica com RG e CPF.

E se o @DiscriminatorValue = ‘J’ eu vou mostrar o formulário de pessoa Juridica com CNPJ e I.E e I.M.

Se isso não for possivel poderiam me ajudar em como fazer isso?

Abr,
Altair[/quote]

dá pra vc fazer o teste usando instanceof dentro de c:if, por exemplo

[quote=ffoliveira]Olá Amigos, sou novo aqui no fórum, e novo também na linguagem, aproveitei o tópico para pedir ajuda em relação
ao mapeamento dos objetos das classes mencionadas acima (pessoa/Fisica/Juridica).
Devo ter um DAO para cada classe?

Obrigado![/quote]

A questão de ter um DAO para cada classe/entidade/tabela depende da arquitetura do seu sistema. Uma prática muito comum, que você pode adotar e que será de fácil entendimento para todos de sua equipe, é criar um DAO por tabela.

[quote=duduribeiro]Boa noite pessoal, estou com uma dúvida no mapemaneto de minhas classes

Como poderia fazer uma classe e o mapeamento da tabela cliente, sendo que um cliente pode ser pessoa fisica e juridica. Pensei em fazer a classe pessoa ser uma interface, mas não sei se seria possivel mapear para o banco.

Obrigado[/quote]

Acho que seria uma boa idéia manter a classe Pessoa como abstrata. Pois um cliente é ou pessoa física ou jurídica, e não simplesmente uma Pessoa.

Muito obrigado felipe_gdr.