allocationSize
parametern måste matcha INCREMENT BY
sekvensens värde.
Det fungerar på ett sådant sätt att Hibernate får ett värde från sekvensen (från databasen), och sedan behåller det värdet i minnet och genererar nästa X efterföljande identifierare (där X=allokationsstorlek) som ökar detta värde med 1 i minnet, utan nå databasen.
När Hibernate genererar X-identifierare får det nästa värde från sekvensen och genererar nya X-identifierare, vilket ökar det värdet med 1
Ett enkelt exempel - låt säga att:
@SequenceGenerator( ....allocationSize=5 ...)
CREATE SEQUENCE .... INCREMENT BY 1 ...
I ovanstående fall Hibernate:
- Hämtar det första numret från sekvensen - låt säga
NextVal = 1
och lagrar den i minnet - Genererar nästa
allocationSize=5
identifierare som ökar ovanstående värde med 1, det vill säga:Id = 1, 2, 3, 4, 5
- Hämtar nästa nummer från sekvensen - på grund av
INCREMENT BY 1
,nextVal
blir:2
- Genererar nästa
allocationSize=5
identifierare som ökar ovanstående värde med 1, det vill säga:Id = 2, 3, 4, 5, 6
Som du kan se kommer det att orsaka ett dubbelfel.
Tänk nu på det här fallet:
@SequenceGenerator( ....allocationSize=5 ...)
CREATE SEQUENCE .... INCREMENT BY 5 ...
I det här fallet Hibernate:
- Hämtar det första numret från sekvensen - låt säga
NextVal = 1
och lagrar den i minnet - Genererar nästa
allocationSize=5
identifierare som ökar ovanstående värde med 1, det vill säga:Id = 1, 2, 3, 4, 5
- Hämtar nästa nummer från sekvensen - på grund av
INCREMENT BY 5
,nextVal
blir:6
- Genererar nästa
allocationSize=5
identifierare som ökar ovanstående värde med 1, det vill säga:Id = 6, 7, 8, 9, 10
I det här fallet finns det inget dubblettfel.
Det sista fallet har nackdelen att om sekvensen används utanför Hibernate, kommer sekvensen att skapa luckor.