allocationSize
parameter moet overeenkomen met de INCREMENT BY
waarde van de reeks.
Het werkt op zo'n manier dat Hibernate een waarde uit de reeks (uit de database) haalt en die waarde vervolgens in het geheugen houdt en de volgende X volgende identifiers genereert (waarbij X =allocationSize) die deze waarde met 1 in het geheugen verhoogt, zonder reiken naar de database.
Zodra Hibernate X-ID's genereert, haalt het de volgende waarde uit de reeks en genereert het nieuwe X-ID's, waarbij die waarde met 1 wordt verhoogd
Een eenvoudig voorbeeld - laten we zeggen:
@SequenceGenerator( ....allocationSize=5 ...)
CREATE SEQUENCE .... INCREMENT BY 1 ...
In het bovenstaande geval Slaapstand:
- Haal het eerste getal uit de reeks op - laten we zeggen
NextVal = 1
en slaat het op in het geheugen - Genereert volgende
allocationSize=5
identifiers die de bovenstaande waarde met 1 verhogen, dat wil zeggen:Id = 1, 2, 3, 4, 5
- Haalt het volgende nummer uit de reeks - vanwege
INCREMENT BY 1
, denextVal
wordt:2
- Genereert volgende
allocationSize=5
identifiers die de bovenstaande waarde met 1 verhogen, dat wil zeggen:Id = 2, 3, 4, 5, 6
Zoals je kunt zien, zal dit een dubbele fout veroorzaken.
Overweeg nu alstublieft dit geval:
@SequenceGenerator( ....allocationSize=5 ...)
CREATE SEQUENCE .... INCREMENT BY 5 ...
In dit geval Slaapstand:
- Haal het eerste getal uit de reeks op - laten we zeggen
NextVal = 1
en slaat het op in het geheugen - Genereert volgende
allocationSize=5
identifiers die de bovenstaande waarde met 1 verhogen, dat wil zeggen:Id = 1, 2, 3, 4, 5
- Haalt het volgende nummer uit de reeks - vanwege
INCREMENT BY 5
, denextVal
wordt:6
- Genereert volgende
allocationSize=5
identifiers die de bovenstaande waarde met 1 verhogen, dat wil zeggen:Id = 6, 7, 8, 9, 10
In dit geval is er geen dubbele fout.
Het laatste geval heeft het nadeel dat als de reeks buiten Hibernate wordt gebruikt, de reeks hiaten zal produceren.