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;
}