Fórum Composição #389842

03/11/2010

0

Olá Estou iniciando com java e tenho uma duvida. segue:   tenho uma composição Pessoa com Pessoa Fisica e Pessoa Juridica   @Entity
@Table(name="PRJ020001")
@SequenceGenerator(name="KEY", sequenceName="GNT_PRIMARY_KEY")
public class Pessoa implements Serializable {
    @Id
    @Column(nullable=true, name="PESSOA_ID")
    @GeneratedValue(strategy=GenerationType.AUTO, generator="KEY")
    Integer pessoaId;
    @Column(nullable=false, name="TIPOPESSOA")
    String tipoPessoa;       /// Composição com pessoas fisicas e juridicas
    @OneToOne(mappedBy = "pessoa", cascade={CascadeType.ALL})
    PessoaFisica pf;
    @OneToOne(mappedBy = "pessoa", cascade={CascadeType.ALL})
    PessoaJuridica pj;
    public Pessoa() {
    }
Getter e Setter omitidos...     public class PessoaFisica implements Serializable {
    @Id
    @Column(name="PESSOAFISICA_ID")
    @GeneratedValue(strategy=GenerationType.AUTO, generator="KEY")
    private Integer pessoaFisicaId;
    @Column(name="NOME")
    private String  nome;
    @Column(name="APELIDO")
    private String  apelido;
    @Column(name="DATANASCIMENTO")
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date    dataNascimento;
    @Column(name="CPF")
    private String  cpf;
    @Column(name="RG")
    private String  rg;
    @Column(name="RGEXPEDIDOR")
    private String  rgExpedidor;
    @Column(name="RGDATAEXPEDICAO")
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date    rgDataExpedicao;
    @Column(name="SEXO")
    private String  sexo;
    @Column(name="ESTADOCIVIL")
    private String  estadoCivil;
    @Column(name="PROFISSAO")
    private String  profissao;
    @Column(name="PORTADORDEFICIENCIA")
    private String  portadorDeficiencia;
    @Column(name="DESCRICAODEFICIENCIA")
    private String  descricaoDeficiencia;
    @OneToOne(cascade={CascadeType.ALL}, optional=false)
    @JoinColumn(name = "PESSOA_ID", referencedColumnName = "PESSOA_ID")
    private Pessoa pessoa;     public PessoaFisica() {
    }   Getter e Setter omitidos...
@Entity
@Table(name="PRJ020023")
@SequenceGenerator(name="KEY", sequenceName="GNT_PRIMARY_KEY")
public class PessoaJuridica implements Serializable {
    @Id
    @Column(name="PESSOAJURIDICA_ID")
    @GeneratedValue(strategy=GenerationType.AUTO, generator="KEY")
    private Integer pessoaJuridicaId;
    @Column(name="RAZAOSOCIAL")
    private String razaoSocial;
    @Column(name="NOMEFANTASIA")
    private String nomeFantasia;
    @Column(name="DATAFUNDACAO")
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date   dataFundacao;
    @Column(name="CNPJ")
    private String cnpj;
    @Column(name="IE")
    private String ie;
    @Column(name="IM")
    private String im;
    @OneToOne(cascade={CascadeType.ALL}, optional=false)
    @JoinColumn(name = "PESSOA_ID", referencedColumnName = "PESSOA_ID")
    private Pessoa pessoa;     public PessoaJuridica() {
    }
  Getter e Setter omitidos...     A duvida é a seguinte:   Como posso fazer para fazer uma simples consulta/lista que me devolva todas as pessoas com os campos? Código Pessoa |  Nome/Razão Social | Data Nascimento/Data Fundação   Uma solução seria uma view no banco de dados, mas não quero.   Preciso fazer uma interface onde o usuário vai consultar pessoas por Nome/Razão Social. Ele vai escrever MARIA e preciso pesquisar em pessoas fisicas e pessoas juridicas e trazer em uma unica lista.   Eu pensei em fazer uma outra classe que juntasse as duas classes, mas não sei se seria a melhor forma.   Como fazer? Ou qual a melhor forma de fazer?   Obrigado   Ageu
Ageu Junior

Ageu Junior

Responder

Posts

03/11/2010

Davi Costa

Ageu,

não sei se é a melhor estratégia, mas analisa o seguinte:

Vc cria a entidade pessoa, como todos os seus campos e nenhum relacionamento nem com pessoa física nem jurídica, vc mantém nessa classe todos os atributos que são os mesmos em pessoa física e jurídica:

@Entity
@Table(name="PRJ020001")
@SequenceGenerator(name="KEY", sequenceName="GNT_PRIMARY_KEY")
public class Pessoa implements Serializable {
    @Id
    @Column(nullable=true, name="PESSOA_ID")
    @GeneratedValue(strategy=GenerationType.AUTO, generator="KEY")
    Integer pessoaId;
    @Column(nullable=false, name="TIPOPESSOA")
    String tipoPessoa;  
    public Pessoa() {
    }
Getter e Setter omitidos...


Porém em pessoa física e jurídica vc mantém uma pessoa. E nessas duas vc só coloca os atributos específicos de cada uma. Simplesmente isso dai, quando vc pesquisar por pessoa física ou jurídica com uma consulta apontando para uma única tabela (pessoa física ou jurídica) o JPA vai te retornar todos os registros.

espero ter ajudado

Att Davi

Responder

Gostei + 0

03/11/2010

Ageu Junior

Olá Davi Obrigado pela sua resposta.   Foi exatamente isso que eu fiz. só que não encontrei muitos atributos em comum. O que eu poderia fazer é trazer as propriedades Nome de PessoaFisica e RazaoSocial de Pessoa Juridica e colocar na entidade Pessoa com sendo um unico campo. Idem para Apelido/NomeFantasia, DataNascimento/DataFundacao, CPF/CNPJ e RG/IE.   Os demais campos são especificos de cada entidade.   Porém não sei se é e melhor solução. Se eu conseguir manter separado nos atributos e encontrar uma forma de juntar os dados numa consulta que seja eficiente, vou implementar.   Vou aguardar orientação de outros colegas.   Obrigado   Ageu
Responder

Gostei + 0

04/11/2010

Davi Costa

Cara o que posso te pasar tb a nível de herança é que o hibernate possui 3 estratégias para herança:

Estratégia Tabela por Classe Essa estratégia tem várias desvantagens (prinvcipalmentecom consultas que envolvem superclasses e subclasses e suas associações) explicadas na especificação EJB 3, na documentação de referência do Hibernate e em outras fontes. Abaixo um código de exemplo:   @Entity @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) public class Pessoa implements Serializable {

  Esta estratégia suporta uma ou muitasassociações desde que elas sejam bidirecionais, ou seja, uma classe pode acessar os dados da outra classe e vice-versa. Esta estratégia não suporta as anotações para geração de Id (IDENTITY): o Id tem de ser compartilhado por meio de várias tabelas. Conseqüentemente, quando usamos esta estratégia, a classe não deve ter anotações AUTO e nem IDENTITY.
Estratégia Única Tabela por Hierarquia de Classes Todas as propriedades de todas as super e subclasses são mapeadas em uma mesma tabela, instancias são distinguidas por uma anotação especial para as colunas, denominada @DiscriminatorColumn.   @Entity @Inheritance(strategy=
InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(   name="planetype",   discriminatorType=
  DiscriminatorType.STRING ) @DiscriminatorValue("Pessoa") public class Pessoa{ ... } @Entity @DiscriminatorValue("PessoaFisica") public class PessoaFisica extends Pessoa{ ... }
No código acima, Pessoa é a superclasse. A estratégia de herança definida na anotação @Inheritance é InheritanceType.SINGLE_TABLE. O exemplo também define o nome da coluna que distingue (planetype) os objetos das superclasses e subclasses através da anotação @DiscriminatorColumn, uma coluna discriminadora pode também definir o tipo do discriminador (discriminatorType). Finalmente, a anotação @DiscriminatorValue define o valor usado para diferenciar as classes na hierarquia. Todos estes atributos têm valores padrões definidos. O nome padrão da coluna discriminadora é DTYPE. O valor padrão do discriminado é o nome da entidade (como definido em @Entity.name) para DiscriminatorType.String. PessoaFisica é uma subclasse de Pessoa. Assim, a tabela representante da hierarquia conterá no campo planetype o valor Plane quando se tratar de um registro na superclasse e o valor PessoaFisica quando se tratar de um registro da subclasse.
Vale ressaltar que essa estratégia possui um ponto de atenção. Como mapeamos todas as superclasses e subclasses para uma única tabela, poderemos ter várias colunas em branco para uma única tupla dessa tabela. Isso acontece porque pode existir mais de uma subclasse, assim, os atributos das demais subclasses não serão preenchidos quando uma delas for persistida.
E a terceira é a que te passei Estratégia Sub-classes interligadas, que na minha opnião é a melhor.
Att Davi

Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar