allocationSize
parametr musi być zgodny z INCREMENT BY
wartość ciągu.
Działa w ten sposób, że Hibernate pobiera wartość z sekwencji (z bazy danych), a następnie utrzymuje ją w pamięci i generuje kolejne X kolejnych identyfikatorów (gdzie X=rozmiar alokacji) zwiększając tę wartość o 1 w pamięci, bez sięganie po bazę danych.
Gdy Hibernate wygeneruje identyfikatory X, pobiera następną wartość z sekwencji i generuje nowe identyfikatory X, zwiększając tę wartość o 1
Prosty przykład - powiedzmy, że:
@SequenceGenerator( ....allocationSize=5 ...)
CREATE SEQUENCE .... INCREMENT BY 1 ...
W powyższym przypadku Hibernacja:
- Pobiera pierwszą liczbę z sekwencji — powiedzmy
NextVal = 1
i przechowuje go w pamięci - Generuje następny
allocationSize=5
identyfikatory zwiększające powyższą wartość o 1, czyli:Id = 1, 2, 3, 4, 5
- Pobiera kolejną liczbę z sekwencji — z powodu
INCREMENT BY 1
,nextVal
będzie:2
- Generuje następny
allocationSize=5
identyfikatory zwiększające powyższą wartość o 1, czyli:Id = 2, 3, 4, 5, 6
Jak widać, spowoduje to zduplikowany błąd.
Rozważ teraz ten przypadek:
@SequenceGenerator( ....allocationSize=5 ...)
CREATE SEQUENCE .... INCREMENT BY 5 ...
W tym przypadku Hibernacja:
- Pobiera pierwszą liczbę z sekwencji — powiedzmy
NextVal = 1
i przechowuje go w pamięci - Generuje następny
allocationSize=5
identyfikatory zwiększające powyższą wartość o 1, czyli:Id = 1, 2, 3, 4, 5
- Pobiera następną liczbę z sekwencji — z powodu
INCREMENT BY 5
,nextVal
będzie:6
- Generuje następny
allocationSize=5
identyfikatory zwiększające powyższą wartość o 1, czyli:Id = 6, 7, 8, 9, 10
W tym przypadku nie ma duplikatu błędu.
Ostatni przypadek ma tę wadę, że jeśli sekwencja jest używana poza Hibernate, to sekwencja będzie generować przerwy.