Ao mapearmos nossas classes às tabelas do banco de dados, um passo fundamental é definir qual campo dessa classe estará relacionado à chave primária da tabela. Assim como precisamos ter essa chave em toda tabela, precisamos de um campo equivalente em toda entidade.

Neste documento será apresentado como utilizar a anotação @Id.

@Id

A anotação I@Id é utilizada para informar ao JPA qual campo/atributo de uma entidade estará relacionado à chave primária da respectiva tabela no banco de dados. Essa é uma anotação obrigatória e um erro será gerado em tempo de execução caso ela não esteja presente.

A seguir temos um exemplo de uso:

@Entity
public class Produto {
 
        	@Id
        	private long id;
 
}

Com este código, a entidade Produto terá como identificador único o campo id, e esse campo estará relacionado à coluna de mesmo nome na tabela Produto, a qual representa a chave primária (primary key).

Caso a coluna possua um nome diferente (id_produto, por exemplo), devemos utilizar a anotação @Column sobre o respectivo campo da seguinte forma: @Column(name=”id_produto”).

Nota: A anotação @Id faz parte do pacote javax.persistence.

O campo que representa a chave primária pode ser de qualquer tipo primitivo do Java, wrappers de tipos primitivos (como Integer e Long), String, java.util.Date, java.sql.Date, java.math.BigDecimal ou java.math.BigInteger.

Quando declaramos apenas essa anotação, a responsabilidade de criar o identificador será da nossa aplicação, isto é, do nosso código, o que, em muitos casos, não é indicado. Para que a geração de ids seja controlada pelo provedor de persistência (Hibernate, por exemplo), fazemos uso da anotação @GeneratedValue logo após @Id.


@Entity
public class Produto {
 
  @Id
  @GeneratedValue
  private long id;
 
}

Com este código, o id da entidade Produto será gerenciado pelo provedor de persistência, que se comunicará com o banco de dados para geração do valor da chave primária.

Exemplo prático

Suponha que criamos a classe Pessoa e desejamos que CPF seja o campo responsável por identificar unicamente uma pessoa no sistema. Com isso em mente, podemos programar o código abaixo:


@Entity
public class Pessoa {
        	
  @Id
  private String cpf;
 
  private String nome;
 
  //getters e setters omitidos...
 
}

Ao executar esse código, será criada uma tabela de nome Pessoa no banco de dados (caso não exista e assim seja configurado) com as colunas nome e cpf, sendo cpf a chave primária.