allocationSize
O parâmetro deve corresponder ao INCREMENT BY
valor da sequência.Ele funciona de tal forma que o Hibernate obtém um valor da sequência (do banco de dados), e então mantém esse valor na memória e gera os próximos X identificadores subsequentes (onde X=allocationSize) incrementando esse valor em 1 na memória, sem alcançando o banco de dados.
Uma vez que o Hibernate gera identificadores X, ele obtém o próximo valor da sequência e gera novos identificadores X, incrementando esse valor em 1
Um exemplo simples - digamos que:
@SequenceGenerator( ....allocationSize=5 ...)
CREATE SEQUENCE .... INCREMENT BY 1 ...
No caso acima Hibernate:
- Busca o primeiro número da sequência - digamos
NextVal = 1
e armazena na memória - Gera o próximo
allocationSize=5
identificadores incrementando o valor acima em 1, ou seja:Id = 1, 2, 3, 4, 5
- Busca o próximo número da sequência - devido a
INCREMENT BY 1
, onextVal
será:2
- Gera o próximo
allocationSize=5
identificadores incrementando o valor acima em 1, ou seja:Id = 2, 3, 4, 5, 6
Como você pode ver, isso causará um erro duplicado.
Agora, considere este caso:
@SequenceGenerator( ....allocationSize=5 ...)
CREATE SEQUENCE .... INCREMENT BY 5 ...
Neste caso, hibernar:
- Busca o primeiro número da sequência - digamos
NextVal = 1
e armazena na memória - Gera o próximo
allocationSize=5
identificadores incrementando o valor acima em 1, ou seja:Id = 1, 2, 3, 4, 5
- Busca o próximo número da sequência - devido a
INCREMENT BY 5
, onextVal
será:6
- Gera o próximo
allocationSize=5
identificadores incrementando o valor acima em 1, ou seja:Id = 6, 7, 8, 9, 10
Neste caso, não há erro duplicado.
O último caso tem a desvantagem de que, se a sequência for usada fora do Hibernate, a sequência produzirá lacunas.