sql >> Database >  >> RDS >> Oracle

javax.persistence.EntityExistsException met SequenceGenerator

allocationSize parameter moet overeenkomen met de INCREMENT BY waarde van de reeks.

Het werkt op zo'n manier dat Hibernate een waarde uit de reeks (uit de database) haalt en die waarde vervolgens in het geheugen houdt en de volgende X volgende identifiers genereert (waarbij X =allocationSize) die deze waarde met 1 in het geheugen verhoogt, zonder reiken naar de database.

Zodra Hibernate X-ID's genereert, haalt het de volgende waarde uit de reeks en genereert het nieuwe X-ID's, waarbij die waarde met 1 wordt verhoogd

Een eenvoudig voorbeeld - laten we zeggen:

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

In het bovenstaande geval Slaapstand:

  1. Haal het eerste getal uit de reeks op - laten we zeggen NextVal = 1 en slaat het op in het geheugen
  2. Genereert volgende allocationSize=5 identifiers die de bovenstaande waarde met 1 verhogen, dat wil zeggen:Id = 1, 2, 3, 4, 5
  3. Haalt het volgende nummer uit de reeks - vanwege INCREMENT BY 1 , de nextVal wordt:2
  4. Genereert volgende allocationSize=5 identifiers die de bovenstaande waarde met 1 verhogen, dat wil zeggen:Id = 2, 3, 4, 5, 6

Zoals je kunt zien, zal dit een dubbele fout veroorzaken.

Overweeg nu alstublieft dit geval:

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

In dit geval Slaapstand:

  1. Haal het eerste getal uit de reeks op - laten we zeggen NextVal = 1 en slaat het op in het geheugen
  2. Genereert volgende allocationSize=5 identifiers die de bovenstaande waarde met 1 verhogen, dat wil zeggen:Id = 1, 2, 3, 4, 5
  3. Haalt het volgende nummer uit de reeks - vanwege INCREMENT BY 5 , de nextVal wordt:6
  4. Genereert volgende allocationSize=5 identifiers die de bovenstaande waarde met 1 verhogen, dat wil zeggen:Id = 6, 7, 8, 9, 10

In dit geval is er geen dubbele fout.

Het laatste geval heeft het nadeel dat als de reeks buiten Hibernate wordt gebruikt, de reeks hiaten zal produceren.




  1. SQLite Linker Join

  2. Hoe beïnvloedt isolatie op transactieniveau de prestaties in de autocommit-modus in MySQL?

  3. het lezen van MySQL is sneller of het lezen van een bestand is sneller?

  4. Waarom krijg ik de status E_FAIL teruggestuurd door de gegevensprovider of een andere service? Native SQL-client