allocationSize
el parámetro debe coincidir con INCREMENT BY
valor de la secuencia.
Funciona de tal manera que Hibernate obtiene un valor de la secuencia (de la base de datos), y luego mantiene ese valor en la memoria y genera los siguientes X identificadores posteriores (donde X=allocationSize) incrementando este valor en 1 en la memoria, sin buscando la base de datos.
Una vez que Hibernate genera identificadores X, obtiene el siguiente valor de la secuencia y genera nuevos identificadores X, incrementando ese valor en 1
Un ejemplo simple, digamos que:
@SequenceGenerator( ....allocationSize=5 ...)
CREATE SEQUENCE .... INCREMENT BY 1 ...
En el caso anterior, Hibernate:
- Obtiene el primer número de la secuencia, digamos
NextVal = 1
y lo almacena en la memoria - Genera el siguiente
allocationSize=5
identificadores que incrementan el valor anterior en 1, es decir:Id = 1, 2, 3, 4, 5
- Obtiene el siguiente número de la secuencia - debido a
INCREMENT BY 1
, elnextVal
será:2
- Genera el siguiente
allocationSize=5
identificadores que incrementan el valor anterior en 1, es decir:Id = 2, 3, 4, 5, 6
Como puede ver, provocará un error duplicado.
Ahora considere este caso:
@SequenceGenerator( ....allocationSize=5 ...)
CREATE SEQUENCE .... INCREMENT BY 5 ...
En este caso Hibernate:
- Obtiene el primer número de la secuencia, digamos
NextVal = 1
y lo almacena en la memoria - Genera el siguiente
allocationSize=5
identificadores que incrementan el valor anterior en 1, es decir:Id = 1, 2, 3, 4, 5
- Obtiene el siguiente número de la secuencia - debido a
INCREMENT BY 5
, elnextVal
será:6
- Genera el siguiente
allocationSize=5
identificadores que incrementan el valor anterior en 1, es decir:Id = 6, 7, 8, 9, 10
En este caso no hay error de duplicado.
El último caso tiene la desventaja de que si la secuencia se usa fuera de Hibernate, la secuencia producirá espacios.