sql >> Databasteknik >  >> RDS >> Oracle

javax.persistence.EntityExistsException med SequenceGenerator

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:

  1. Hämtar det första numret från sekvensen - låt säga NextVal = 1 och lagrar den i minnet
  2. Genererar nästa allocationSize=5 identifierare som ökar ovanstående värde med 1, det vill säga:Id = 1, 2, 3, 4, 5
  3. Hämtar nästa nummer från sekvensen - på grund av INCREMENT BY 1 , nextVal blir:2
  4. 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:

  1. Hämtar det första numret från sekvensen - låt säga NextVal = 1 och lagrar den i minnet
  2. Genererar nästa allocationSize=5 identifierare som ökar ovanstående värde med 1, det vill säga:Id = 1, 2, 3, 4, 5
  3. Hämtar nästa nummer från sekvensen - på grund av INCREMENT BY 5 , nextVal blir:6
  4. 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.




  1. Databas hög tillgänglighet för Camunda BPM med MySQL eller MariaDB Galera Cluster

  2. Få en lista över databaspostkonton i SQL Server (T-SQL)

  3. Vilka är begränsningarna för att implementera MySQL NDB Cluster?

  4. Hur gör jag resultatet av SQL-frågor med LIMIT olika i varje fråga?