sql >> Database teknologi >  >> RDS >> Oracle

javax.persistence.EntityExistsException med SequenceGenerator

allocationSize parameter skal matche INCREMENT BY værdien af ​​sekvensen.

Det fungerer på en sådan måde, at Hibernate får en værdi fra sekvensen (fra databasen), og derefter beholder denne værdi i hukommelsen og genererer næste X efterfølgende identifikatorer (hvor X=allokationsstørrelse) øger denne værdi med 1 i hukommelsen, uden at nå til databasen.

Når først Hibernate genererer X identifikatorer, får den den næste værdi fra sekvensen og genererer nye X identifikatorer, hvilket øger denne værdi med 1

Et simpelt eksempel - lad os sige, at:

  • @SequenceGenerator( ....allocationSize=5 ...)
  • CREATE SEQUENCE .... INCREMENT BY 1 ...

I ovenstående tilfælde Dvale:

  1. Henter det første tal fra sekvensen - lad os sige NextVal = 1 og gemmer det i hukommelsen
  2. Genererer næste allocationSize=5 identifikatorer, der øger ovenstående værdi med 1, dvs.:Id = 1, 2, 3, 4, 5
  3. Henter det næste tal fra sekvensen - på grund af INCREMENT BY 1 , nextVal vil være:2
  4. Genererer næste allocationSize=5 identifikatorer, der øger ovenstående værdi med 1, dvs.:Id = 2, 3, 4, 5, 6

Som du kan se, vil det forårsage en dobbelt fejl.

Overvej nu denne sag:

  • @SequenceGenerator( ....allocationSize=5 ...)
  • CREATE SEQUENCE .... INCREMENT BY 5 ...

I dette tilfælde Dvale:

  1. Henter det første tal fra sekvensen - lad os sige NextVal = 1 og gemmer det i hukommelsen
  2. Genererer næste allocationSize=5 identifikatorer, der øger ovenstående værdi med 1, dvs.:Id = 1, 2, 3, 4, 5
  3. Henter det næste tal fra sekvensen - på grund af INCREMENT BY 5 , nextVal vil være:6
  4. Genererer næste allocationSize=5 identifikatorer, der øger ovenstående værdi med 1, dvs.:Id = 6, 7, 8, 9, 10

I dette tilfælde er der ingen dubletfejl.

Det sidste tilfælde har den ulempe, at hvis sekvensen bruges uden for Hibernate, vil sekvensen producere huller.




  1. Forespørgsel, der bruger group_concat, returnerer kun én række

  2. MySQL:Hvad står % for i værtskolonnen og hvordan man ændrer brugerens adgangskode

  3. PostgreSQL til XML med 3 tabeller

  4. Er det muligt at få mac-adressen ved hjælp af en lagret procedure?