Estratégia de SEQUENCE para gerar ID

O banco de dados Oracle possui um tipo de objeto que pode ser criado internamente chamado SEQUENCE (sequência) e que pode ser associado a um contador. Cada vez que o seu próximo valor é solicitado ocorre um incremento deste valor. Para gerar o ID da entidade é possível utilizar a estratégia de SEQUENCE também, associando a sequência criada no banco de dados com o gerador de ID.

No exemplo, a seguir, será criada uma entidade que utiliza uma SEQUENCE para gerar o id referente a chave primária da tabela. Primeiro será criada a sequência USUARIO_SEQ no banco de dados:

CREATE SEQUENCE USUARIO_SEQ INCREMENT BY 1 START WITH 1 NOCACHE NOCYCLE;

A seguir, crie a entidade Usuario que utilizará está sequência para gerar o ID.

package pbc.jpa.exemplo.sequence.modelo;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

/**
 * Classe utilizada para demonstrar o uso da SEQUENCE.
 */
@Entity
@Table(name = "USUARIO")
@SequenceGenerator(name="USU_SEQ", sequenceName="USUARIO_SEQ",
  initialValue=1, allocationSize=1)
public class Usuario implements Serializable {
  private static final long serialVersionUID 
    = -4023522856316087762L;

  @Id
  @GeneratedValue(strategy = GenerationType.SEQUENCE, 
    generator = "USU_SEQ")
  private Long id;
  private String nome;

  public Long getId() { return id; }
  public void setId(Long id) { this.id = id; }

  public String getNome() { return nome; }
  public void setNome(String nome) { this.nome = nome; }
}

A anotação @SequenceGenerator vai indicar qual a sequência do banco de dados, qual o valor inicial e a quantidade que esta sequência é incrementada.

  • name = informa o apelido da sequence exemplo "USU_SEQ";
  • sequenceName = informa o nome da sequência criada no banco de dados, por exemplo: "USUARIO_SEQ";
  • initialValue = informa o valor inicial da sequência, por exemplo: 1;
  • allocationSize = informa a quantidade que será incrementada na sequência, o padrão (default) é 50, neste exemplo foi definido que será incrementado de 1 em 1.

A anotação @GeneratedValue nesse caso está usando a estratégia de SEQUENCE então ele vai procurar a sequência que tem o apelido "USU_SEQ" e faz um consulta no banco para pegar seu resultado:

SELECT USUARIO_SEQ.NEXTVAL FROM DUAL;
  • strategy = informa o tipo de estratégia que será utilizado nesse exemplo GenerationType.SEQUENCE;
  • generator = informa o apelido da sequence nesse exemplo "USU_SEQ".

results matching ""

    No results matching ""