Quando utlizamos ( no meu caso 0 JBoss ) , que trabalha com um pool de conexões, e com hibernate, utilizando sequences para geração de ID´s para as tabelas, pode ocorrer de estes ID´s serem gerados com um intervalo diferente do definido no banco. Por exemplo, na criação desta sequence oracle:
CREATE SEQUENCE TABELA_SEQ START WITH 1 INCREMENT BY 1;
Isto irá gerar por padrão uma sequence com cache de 20, ou seja, o oracle já aloca os 20 ids proximos para nao efetuar esta operação novamente no banco durante 20 iterações, ficando em memória e agilizando o processo.
Mas quando utilizamos um pool de conexões, isto nao deve ser feito, pois o cache é feito por conexão do banco, ou seja se o mesmo servidor tem 10 conexoes ao banco, quando uma delas efetuar um TABELA_SEQ.NEXTVAL, vai retornar o proximo id, digamos que seja 1, e irá guardar em memória até o 20. E se após isto, na outra conexão for executado o nextval novamente, irá retornar o 21. E não podemos gerenciar com qual conexão devemos ir ao banco, até pq daí nao teria necessidade de se ter um gerenciamento pelo application server !
Então o correto para criar a sequence é com o comando abaixo:
CREATE SEQUENCE TABELA_SEQ START WITH 1 INCREMENT BY 1 NOCACHE;