Dúvida Annotations hibernate

4 respostas
robinsonbsilva

Bom tarde a todos!

Estou iniciando em "Hibernate" e estou com dificuldade para mapear o relacionamento "um para um" entre duas tabelas.

CREATE TABLE "empresa"(
   "id_empresa" int NOT NULL,
   "razao_social" varchar(80),
   "nome_fantasia" varchar(80),
   "cnpj" varchar(18),
   "id_endereco" int,
   "data_excluido" date,
   "excluido" int,
   "id_funcionario_exclusao" int,
   CONSTRAINT "pk_empresa" PRIMARY KEY ("id_empresa")
);

CREATE TABLE "endereco"(
   "id_endereco" int NOT NULL,
   "endereco" varchar(45),
   "bairro" varchar(45),
   "cidade" varchar(45),
   "estado" varchar(2),
   "cep" varchar(9),
   "complemento" varchar(50),
   "data_excluido" date,
   "excluido" int,
   "id_funcionario_exclusao" int,
   CONSTRAINT "pk_endereco" PRIMARY KEY ("id_endereco")
);

Onde a tabela empresa possui uma chave estrangeira "id_endereco" a qual referencia a tabela endereco
Minhas classes estão com as seguintes annotations:

-->Empresa

@Entity
@Table(name="empresa")
public class Empresa implements Serializable {

    @Id
    @Column(name="id_empresa")
    @GeneratedValue(strategy=GenerationType.SEQUENCE)
    private Integer idEmpresa;

    @Column(name="razao_social")
    private String razaoSocial;

    @Column(name="nome_fantasia")
    private String nomeFantasia;

    @Column(name="cnpj")
    private String cnpj;

    @Column(name="id_endereco")
    @OneToOne(cascade={CascadeType.ALL})
    @JoinColumn(name="id_endereco", insertable=false, updatable=false, table="endereco")
    private Endereco endereco;

    @Column(name="data_excluido")
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date dataExcluido;

    @Column(name="excluido")
    private Integer excluido = 0;

    @Column(name="id_funcionario_exclusao")
    private Integer idFuncionarioExclusao = 0;

}

-->Endereço

[code]
@Entity
@Table(name="endereco")
public class Endereco implements Serializable {

    @Id
    @Column(name="id_endereco")
    @GeneratedValue(strategy=GenerationType.SEQUENCE)
    private Integer idEndereco;

    @Column(name="endereco")
    private String endereco;

    @Column(name="bairro")
    private String bairro;

    @Column(name="cidade")
    private String cidade;

    @Column(name="estado")
    private String estado;

    @Column(name="cep")
    private String cep;

    @Column(name="complemento")
    private String complemento;

    @Column(name="data_excluido")
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date dataExcluido;

    @Column(name="excluido")
    private Integer excluido = 0;

    @Column(name="id_funcionario_exclusao")
    private Integer idFuncionarioExclusao = 0;
}
[/code]

4 Respostas

tnaires

Olá.

Se você quer realizar um mapeamento um para um, você não precisa criar uma chave estrangeira na tabela de empresas. Você pode relacionar as duas tabelas através de sua chave primária:
@Entity
public class Empresa {
    // ...

    @OneToOne
    @PrimaryKeyJoinColumn
    private Endereco endereco;
}
Observe o uso da anotação @PrimaryKeyJoinColumn para indicar a associação entre as chaves primárias das duas tabelas.
robinsonbsilva

Valeu tnaires!

Sem querer abusar da sua boa vontade, mas já o fazendo…vc já trabalhou com hibernate + postgresql, pois defini um campo chave do tipo “serial” e queria saber se o hibernate tem alguma annotation para esse tipo??

GenerationType.AUTO
GenerationType.IDENTITY
GenerationType.SEQUENCE
GenerationType.TABLE

Script tabela:

CREATE TABLE empresa
(
  id_empresa serial NOT NULL,
  razao_social character varying(80),
  nome_fantasia character varying(80),
  cnpj character varying(18),
  id_endereco integer,
  data_excluido date,
  excluido integer,
  id_funcionario_exclusao integer,
  CONSTRAINT pk_empresa PRIMARY KEY (id_empresa)
)
tnaires

Quando trabalhei com Hibernate e PostgreSQL, eu realizava a autonumeração dos campos usando as sequences do banco de dados.

Primeiro, precisamos declarar na entidade a sequence:

@Entity @SequenceGenerator(name = "nomeSequence", sequenceName = "nomeSequenceBanco") public class Entidade { // ... }Onde “nomeSequence” pode ser o nome que você quiser, e “nomeSequenceBanco” deve ser o nome do objeto sequence no banco de dados.

Para usar, precisamos fazer assim:

@Id @GeneratedValue(generator = "nomeSequence") private int identificador;O nome a ser usado aqui é o definido no atributo “name” da anotação @SequenceGenerator.

robinsonbsilva

valeu jovem!!

funcionou…estou tendo um novo problema e sem querer ser chato, estou penando para resolver o problema exposto no link:

http://www.guj.com.br/posts/preList/196526/984709.java#984709

Agradeço pela ajuda!

Criado 26 de janeiro de 2010
Ultima resposta 26 de jan. de 2010
Respostas 4
Participantes 2