Dúvida Mapeamento

1 resposta
sfidencio

Pessoal estou com uma dúvida:

Tenho as seguites Tabelas:

Empresa (id,empresa_id,razao_social,nome_fantasia,cnpj,ie,im,matriz_filial)

Obs: temos um autorelacionamento matriz x filial por isso o motivo do "empresa_id".

Fornecedor (id,id_empresa,nome,cpf_cnpj,rg,orgao_rg,ie,im,desde,tipo_pessoa,excluido)
Cliente (id,id_empresa,nome,cpf_cnpj,rg,orgao_rg,ie,im,desde,tipo_pessoa,excluido)

Na regra de negocio o fornecedor pode ser tanto pessoa fisica quanto juridica, assim como o cliente também. Como vocês fariam o mapeamento objeto relacional usando hibernate com annotations para esse cenário. Alguem tem um exemplo?

eu pensei assim a principio:

public class Pessoa {

    private Long id;
    private String nome;
    private tipo char;

}
public class PessoaFisica extends Pessoa {

   private String cpf;   
   private String rg;

}
public class PessoaJuridica extends Pessoa {

   private String cnpj;   
   private String ie;
   private String razaoSocial;

}
public class Cliente {
  private Double limite;
  private Date desde;
  private PessoaFisica pessoaFisica;
  private PessoaJuridica pessoaJuridica;

  public Cliente() {
      this.pessoaFisica = new PessoaFisica();
      this.pessoaJuridica = new PessoaJuridica();
  }


 public void setPessoaFisica(PessoaFisica pessoaFisisca) {
      this.pessoaFisica = pessoaFisica;  
 }


 public void setPessoaJuridica(PessoaJuridica pessoaJuridica) {
      this.pessoaJuridica = pessoaJuridica;  
 }


}

A Classe fornecedor é identica a cliente..assume papel de fisica e juridica também.

agora vem a dúvida., como mapear a tabela cliente e fornecedor nesse caso? observe que o banco não está normalizado visando performance, se eu fosse normalizar daria certo.! mas preciso de performance. Me Ajudem dando exemplos, e observe que tenho o campo CPf e cnpj repetido no banco, volto a dizer visando performance.

obrigado!

1 Resposta

sfidencio

Pessoa Alguem pode me ajudar? Olha só resolvi fazer assim ve se vinga, lembrando que vou usar o caelumm stella pra validar cpf, cppj..etc..etc

@Entity
@Table(name = "PESSOA")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "TIPO_PESSOA", discriminatorType = DiscriminatorType.STRING)
@DiscriminatorValue(value = "PES")
public abstract class Pessoa implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "PESSOA_SEQ")
    @SequenceGenerator(allocationSize = 1, initialValue = 1, name = "PESSOA_SEQ", sequenceName = "PESSOA_SEQ")
    @Column(name = "ID")
    private Long id;
    @Column(name = "NOME", length = 150)
    private String nome;
    @Column(name = "RAZAO_SOCIAL", length = 150)
    private String razaoSocial;
    @Column(name = "RG", length = 20)
    private String rg;
    @Column(name = "ORGAO_RG", length = 10)
    private String orgaoRg;
    @Column(name = "CPF", length = 11)
    private String cpf;
    @Column(name = "CNPJ", length = 14)
    private String cnpj;
    @Column(name = "INSCRICAO_ESTADUAL", length = 30)
    private String inscricaoEstadual;
    @Column(name = "INSCRICAO_MUNICIPAL", length = 30)
    private String inscricaoMunicipal;
    @Column(name = "DESDE")
    @Temporal(TemporalType.DATE)
    private Date desde;
    @Column(name = "EXCLUIDO")
    private Character excluido;
    @Column(name = "DATA_CADASTRO")
    @Temporal(TemporalType.DATE)
    private Date dataCadastro;
    @Temporal(TemporalType.TIME)
    @Column(name = "HORA_CADASTRO")
    private Date horaCadastro;
    @Column(name = "TIPO_CONTRIBUINTE")
    private Character tipoContribuinte; //F - Fisica | J - Juridica

    public Pessoa() {
    }
  //...
}

Não vou cair na besteira de criar es famosas classes PF e PJ, observe as subclasses:

package testeherancahibernate;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;

/**
 *
 * @author FIDENCIO
 */
@Entity
@DiscriminatorValue("CLI")
public class Cliente extends Pessoa implements Serializable {

    private static final long serialVersionUID = 1L;
    @Column(name = "email", nullable = false)
    private String email;

    public Cliente() {
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

Fornecedor...

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package testeherancahibernate;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;

/**
 *
 * @author FIDENCIO
 */
@Entity
@DiscriminatorValue("FOR")
public class Fornecedor extends Pessoa implements Serializable {

    private static final long serialVersionUID = 1L;
    @Column(name = "email", nullable = false)
    private String email;

    public Fornecedor() {
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

Observe que terei uma classe Pessoa que fará todo trabalho,. q vocês acham dessa abordagem? meu cadastro de Cliente, Empresa, Fornecedor, etc.. ficará tudo na tabela pessoa, lembrando que terei um autorelacionamento para referenciar,. qual empresa o cliente/fornecedor.e.tc. pertence.. que tal? pelo menos gargalo nao terei, porem terei campos vazios diversos, e a normalização vai pro saco., e agora ,.o q acham?

att
fidencio

Criado 27 de outubro de 2010
Ultima resposta 28 de out. de 2010
Respostas 1
Participantes 1