Hibernate, dúvida com InheritanceType.JOINED

2 respostas
rylphs

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.

2 Respostas

rylphs

Vixi, foi pro fórum errado. :oops:
Era pra ir pro de Frameworks. Tem como arrumar?

P

A primeira forma me parece a mais correta. A segunda, retornando nulo nos métodos, eu não usaria. Talvez substituiria por uma tabela “Documento”, ou um campo “documento”.

Sobre o artigo (que eu não li), acredito que o autor se refere a praticidade e velocidade ao usar uma tabela só, já que você evita joins.
Na minha opinião, depende o caso. As vezes é melhor sacrificar a normalização para diminuir a complexidade no desenvolvimento.

Criado 4 de maio de 2010
Ultima resposta 4 de mai. de 2010
Respostas 2
Participantes 2