terça-feira, 12 de maio de 2009

OAF - Numeração Automática via Sequence - Sem pular números!

Olá pessoal!

O uso de Sequences para geração de IDs no OAF é, por padrão, feito sobrescrevendo-se o método create() do Entity Object, e dentro dele instanciando um objeto oracle.jbo.SequenceImpl. Um exemplo básico seria:

public void create() {
SequenceImpl seq = new SequenceImpl("MINHA_SEQUENCE");
this.setColunaId(seq.getValue());
}

No entanto, o método create() é executado toda vez que uma linha é criada no VO, ou seja, se o usuário clicar em "Cancelar" e dispensar a linha, a sequence já foi incrementada (o SequenceImpl roda SEQUENCE.NEXTVAL). Portanto, a dúvida é:
Como gerar identificadores via Sequence sem pular números?

A resposta é o método postChanges(), também pertencente ao Entity Object. Este método é chamado somente após todas as validações serem concluídas, alguns momentos antes de inserir a linha no banco. Portanto, é garantia de que qualquer coisa executada neste método só vai rodar se a linha for realmente ser inserida no banco. Por exemplo, escreva isto no seu EntityImpl:

public void postChanges() {
SequenceImpl seq = new SequenceImpl("MINHA_SEQUENCE");
this.setColunaId(seq.getValue());
}

Desta forma, o NEXTVAL na sequence só será chamado quando o framework tiver CERTEZA que a linha vai ser efetivada no BD, eliminando o efeito indesejável de "pulos" no meio da numeração sequencial e que pode ser proibido em alguns casos (ex.: Números de Nota Fiscal).

Até a próxima!