Olá gente,
Tenho a seguinte situação:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Pessoa{
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private int id;
private String endereco;
...
}
@Entity
@PrimaryKeyJoinColumn(name = "id")
public class PessoaJuridica extends Pessoa{
private String fantasia;
private String cnpj;
private String inscricaoEstadual;
...
}
@Entity
@PrimaryKeyJoinColumn(name = "id")
public class PessoaFisica extends Pessoa{
private String nome;
private String cpf;
...
}
Preciso listar todas as pessoas em um JTable, exibindo os atributos específicos de PessoaFisica e PessoaJuridica. Estou fazendo da seguinte forma:
public void atualizaListaFornecedores(){
List pessoas = PessoaDAO.getPessoas();
for(Iterator it = pessoas.iterator; it.hasNext();){
Pessoa pessoa = (Pessoa) it.next();
if(pessoa instanceof PessoaFisica){
Adiciona na tabela dados da pessoa fisica
}
if(pessoa instanceof PessoaJuridica){
Adiciona na tabela dados da pessoa juridica
}
}
}
Uma outra maneira que pensei:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Pessoa{
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private int id;
private String endereco;
public String getCnpj(){
return null;
}
public String getCpf(){
return null;
}
...
}
@Entity
@PrimaryKeyJoinColumn(name = "id")
public class PessoaJuridica extends Pessoa{
private String fantasia;
private String cnpj;
private String inscricaoEstadual;
...
public String getCnpj(){
return this.cnpj;
}
}
@Entity
@PrimaryKeyJoinColumn(name = "id")
public class PessoaFisica extends Pessoa{
private String nome;
private String cpf;
...
public String getCpf(){
return this.cpf;
}
}
Nesse caso, cada filha da classe Pessoa, responderia aos gets de seus atributos, respondendo null aos gets de atributos não correspondentes. Não testei, e nem sei se é possível.
De qualquer forma, existe uma maneira melhor de fazer isso?
O autor do artigo http://blog.caelum.com.br/2007/03/04/jpa-com-hibernate-heranca-e-mapeamentos/ recomenda evitar InheritanceType.JOINED, e no lugar ter uma tabela com todos os atributos. Não seria exagero, você manter essa estrutura de tabelas, sem normalização, só pra favorecer o código? Em uma aplicação com tabelas pequenas tudo bem, mas imaginem uma aplicações com tabelas gigantescas.
Desculpem pelo post grande, mas queria explicar direito minha situação. Espero que tenham entendido. Obrigado.