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!
Assinar:
Postar comentários (Atom)
Nenhum comentário:
Postar um comentário