quinta-feira, 23 de agosto de 2012

Objetos Embutidos - JPA

Começando um post sobre JPA (Java Persistence API).
O conceito que vou falar hoje é Objetos Embutidos.

Vamos supor que tenhamos duas entidades, uma Pessoa e outra Endereço, o relacionamento Pessoa e Endereço é: toda pessoa tem apenas um endereço, ou seja, um caso bem típico para uso de @OneToOne.

Para melhorar a organização, vamos criar as duas classes:


@Entity
class Pessoa{
@Id
@GeneratedValue
private long id;

private String nome;

@Temporal(TemporalType.DATE)
private Calendar nascimento;

@OneToOne //gera uma coluna de relacionamento
private Endereco endereco;
}



@Entity
class Endereco {
@Id
@GeneratedValue
private long id;
private String estado;
private String cidade;
private int numero;
}


Dessa forma que criamos, estamos utilizando duas classes persistentes, ou seja, serão criada duas tabelas, uma para classe Pessoa e outra para classe Endereco e na tabela Pessoa terá uma coluna de relacionamento.

Para podermos recuperar os dados do Endereço de uma Pessoa, duas tabelas precisam ser consultadas através de uma operação de JOIN. Porém esse tipo de operação é muito custoso para o banco de dados.

O mais interessante seria se pudéssemos guardar os endereços das Pessoas dentro da própria tabela Pessoa, tornando desnecessária a existência da tabela Endereco, mas além disso, gostaríamos de manter as duas classes no nosso projeto.

Uma forma de fazer isso é: na classe Pessoa, devemos remover a anotação de cardinalidade @OneToOne. Na classe Endereco, devemos substituir a anotação @Entity por @Embeddable. Além disso não devemos definir uma chave primária para classe Endereco, pois ela não define mais uma entidade.


@Entity
class Pessoa{
@Id
@GeneratedValue
private long id;

private String nome;

@Temporal(TemporalType.DATE)
private Calendar nascimento;

//retiramos a cardinalidade
private Endereco endereco;
}



@Embeddable
class Endereco {
private long id;
private String estado;
private String cidade;
private int numero;
}


Outra forma para conseguir o mesmo resultado seria: Na classe Pessoa, devemos substituir a anotação de cardinalidade @OneToOne por @Embedded. Na classe Endereco, devemos remover a anotação @Entity. Também não devemos definir chave primária, pois ela não define uma entidade.


@Entity
class Pessoa{
@Id
@GeneratedValue
private long id;

private String nome;

@Temporal(TemporalType.DATE)
private Calendar nascimento;

@Embedded
private Endereco endereco;
}



class Endereco {
private long id;
private String estado;
private String cidade;
private int numero;
}

4 comentários:

It was rather popular that in Genus Paris, make trusted you check for the Topper Paris hotels
coupons.
Also see my website > coupons

Obrigado, ajudou muito enteder o conceito de objeto embutido.

Valdeir TADS - UTFPR

Em um modelo do meu projeto, eu tenho exatamente essas classes, Pessoa (@Entity) e uma Endereco (@Embeddable) sendo atributo da classe Pessoa, igual ao seu exemplo acima.

Mas eu tenho um problema... eu terei mais um atributo de endereço (Endereco enderecoComercial) e este também é um @Embedded. No momento que o hibernate cria os relacionamentos, ele encontra um problema de criar as mesmas colunas na tabela de pessoa. Como resolver isso?

Em um modelo do meu projeto, eu tenho exatamente essas classes, Pessoa (@Entity) e uma Endereco (@Embeddable) sendo atributo da classe Pessoa, igual ao seu exemplo acima.

Mas eu tenho um problema... eu terei mais um atributo de endereço (Endereco enderecoComercial) e este também é um @Embedded. No momento que o hibernate cria os relacionamentos, ele encontra um problema de criar as mesmas colunas na tabela de pessoa. Como resolver isso?

Postar um comentário

Gostou da esbórnia de hoje ? Comentem.

Twitter Delicious Facebook Digg Stumbleupon Favorites More