allocationSize
параметърът трябва да съответства на INCREMENT BY
стойност на последователността.
Работи по такъв начин, че Hibernate получава стойност от последователността (от базата данни) и след това запазва тази стойност в паметта и генерира следващите X последващи идентификатори (където X=allocationSize), увеличавайки тази стойност с 1 в паметта, без достигане до базата данни.
След като Hibernate генерира X идентификатори, той получава следващата стойност от последователността и генерира нови X идентификатори, увеличавайки тази стойност с 1
Един прост пример - да кажем, че:
@SequenceGenerator( ....allocationSize=5 ...)
CREATE SEQUENCE .... INCREMENT BY 1 ...
В горния случай Хибернация:
- Извлича първото число от поредицата - да кажем
NextVal = 1
и го съхранява в паметта - Генерира следващ
allocationSize=5
идентификатори, увеличаващи горната стойност с 1, тоест:Id = 1, 2, 3, 4, 5
- Извлича следващото число от поредицата - поради
INCREMENT BY 1
,nextVal
ще бъде:2
- Генерира следващ
allocationSize=5
идентификатори, увеличаващи горната стойност с 1, тоест:Id = 2, 3, 4, 5, 6
Както можете да видите, това ще доведе до дублирана грешка.
Сега, моля, разгледайте този случай:
@SequenceGenerator( ....allocationSize=5 ...)
CREATE SEQUENCE .... INCREMENT BY 5 ...
В този случай Хибернация:
- Извлича първото число от поредицата - да кажем
NextVal = 1
и го съхранява в паметта - Генерира следващ
allocationSize=5
идентификатори, увеличаващи горната стойност с 1, тоест:Id = 1, 2, 3, 4, 5
- Извлича следващото число от поредицата - поради
INCREMENT BY 5
,nextVal
ще бъде:6
- Генерира следващ
allocationSize=5
идентификатори, увеличаващи горната стойност с 1, тоест:Id = 6, 7, 8, 9, 10
В този случай няма дублирана грешка.
Последният случай има недостатъка, че ако последователността се използва извън Hibernate, тогава последователността ще създаде пропуски.