Fórum Composição #389842
03/11/2010
0
@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
Curtir tópico
+ 0Posts
03/11/2010
Davi Costa
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
Gostei + 0
03/11/2010
Ageu Junior
Gostei + 0
04/11/2010
Davi Costa
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
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)