allocationSize
parametr musí odpovídat parametru INCREMENT BY
hodnota sekvence.
Funguje to tak, že Hibernate získá hodnotu ze sekvence (z databáze) a poté tuto hodnotu uchová v paměti a vygeneruje dalších X následných identifikátorů (kde X=allocationSize), které tuto hodnotu zvýší o 1 v paměti, aniž by sáhnout po databázi.
Jakmile Hibernate vygeneruje X identifikátory, získá další hodnotu ze sekvence a vygeneruje nové X identifikátory, přičemž tuto hodnotu zvýší o 1
Jednoduchý příklad – řekněme, že:
@SequenceGenerator( ....allocationSize=5 ...)
CREATE SEQUENCE .... INCREMENT BY 1 ...
Ve výše uvedeném případě Hibernate:
- Načte první číslo ze sekvence – řekněme
NextVal = 1
a uloží jej do paměti - Vygeneruje další
allocationSize=5
identifikátory zvyšující výše uvedenou hodnotu o 1, tj.:Id = 1, 2, 3, 4, 5
- Načte další číslo ze sekvence – kvůli
INCREMENT BY 1
,nextVal
bude:2
- Vygeneruje další
allocationSize=5
identifikátory zvyšující výše uvedenou hodnotu o 1, tj.:Id = 2, 3, 4, 5, 6
Jak vidíte, způsobí to duplicitní chybu.
Nyní zvažte tento případ:
@SequenceGenerator( ....allocationSize=5 ...)
CREATE SEQUENCE .... INCREMENT BY 5 ...
V tomto případě Hibernate:
- Načte první číslo ze sekvence – řekněme
NextVal = 1
a uloží jej do paměti - Vygeneruje další
allocationSize=5
identifikátory zvyšující výše uvedenou hodnotu o 1, tj.:Id = 1, 2, 3, 4, 5
- Načte další číslo ze sekvence – kvůli
INCREMENT BY 5
,nextVal
bude:6
- Vygeneruje další
allocationSize=5
identifikátory zvyšující výše uvedenou hodnotu o 1, tj.:Id = 6, 7, 8, 9, 10
V tomto případě se nejedná o duplicitní chybu.
Poslední případ má tu nevýhodu, že pokud je sekvence použita mimo Hibernate, bude sekvence vytvářet mezery.