domingo, 1 de março de 2009

Hibernate - Relacionamento one-to-one (com annotation)

Embedded

O relacionamento "embedded one-to-one" trata-se de um relacionamento onde os atributos das entidades relacionadas serão persistidas na mesma tabela.

No exemplo temos uma classe Pessoa que tem um relacionamento um-para-um com a classe Endereco.

O relacionamento é definido da seguinte forma:
package myexample;

import javax.persistence.*;

@Entity
public class Pessoa {

 @Id
 private long id;
 private String nome;
 @Embedded
 private Endereco endereco;

        //get's e set's
}
package myexample;

import javax.persistence.Embeddable;

@Embeddable
public class Endereco {

 private String logradouro;

 //get's e set's
}

Com esses annotations, o hibernate irá criar (pesquise por hbm2ddl do Hibernate Tools no Google) uma tabela Pessoa com os seguintes atributos:

  • id bigint not null
  • logradouro varchar(255)
  • nome varchar(255)
  • Relacionamento convencional one-to-one

    O relacionamento convencional um-para-um trata-se de um relacionamento onde os atributos das entidades relacionadas serão persistidas em tabelas distintas.

    O relacionamento das classes Pessoa e Endereco em um relacionamento convencional um-para-um é declarado da seguinte forma:
    package myexample;
    
    import javax.persistence.*;
    
    @Entity
    public class Pessoa {
    
     @Id
     private long id;
     private String nome;
     @OneToOne(cascade = CascadeType.ALL)
     private Endereco endereco;
    
     //get's e set's
    }
    
    package myexample;
    
    import javax.persistence.*;
    
    @Entity
    public class Endereco {
    
     @Id
     private long id;
     private String logradouro;
     @OneToOne(mappedBy = "endereco")
     private Pessoa pessoa; 
    }
    
    O annotaion @OneToOne(mappedBy = "endereco") serve para indicar um relacionamento bidirecional, informando que Endereco é o final do relacionamento entre Pessoa-Endereco e que é mapeado em Pessoa pelo atributo endereco.
    Ou seja, a tabela Pessoa terá a chave estrangeira para Endereco.

    Com esses annotations, o hibernate irá criar duas tabelas: Pessoa e Endereco com os seguintes atributos:

    Pessoa
  • id bigint not null
  • nome varchar(255)
  • endereco_id bigint


  • Endereco
  • id bigint not null
  • logradouro varchar(255)


  • Devo salientar que não é obrigatório declarar esse relacionamento bidirecional. Ele pode ser unidirecional. Para isso basta não declarar o atributo Pessoa em Endereco:
    package myexample;
    
    import javax.persistence.*;
    
    @Entity
    public class Endereco {
    
     @Id
     private long id;
     private String logradouro;
    }
    

    Um comentário: