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 = 1a uloží jej do paměti - Vygeneruje další
allocationSize=5identifiká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,nextValbude:2 - Vygeneruje další
allocationSize=5identifiká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 = 1a uloží jej do paměti - Vygeneruje další
allocationSize=5identifiká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,nextValbude:6 - Vygeneruje další
allocationSize=5identifiká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.