Oracle
 sql >> Datenbank >  >> RDS >> Oracle

javax.persistence.EntityExistsException mit SequenceGenerator

allocationSize Parameter muss mit INCREMENT BY übereinstimmen Wert der Sequenz.

Es funktioniert so, dass Hibernate einen Wert aus der Sequenz (aus der Datenbank) erhält und diesen Wert dann im Speicher behält und die nächsten X nachfolgenden Identifikatoren (wobei X=allocationSize) generiert, die diesen Wert um 1 im Speicher erhöhen, ohne Zugriff auf die Datenbank.

Sobald Hibernate X-Identifikatoren generiert, erhält es den nächsten Wert aus der Sequenz und generiert neue X-Identifikatoren, wobei dieser Wert um 1 erhöht wird

Ein einfaches Beispiel - sagen wir so:

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

Im obigen Fall Hibernate:

  1. Holt die erste Zahl aus der Sequenz - sagen wir mal NextVal = 1 und speichert es im Speicher
  2. Erzeugt die nächste allocationSize=5 Bezeichner, die den obigen Wert um 1 erhöhen, also:Id = 1, 2, 3, 4, 5
  3. Holt die nächste Zahl aus der Folge - wegen INCREMENT BY 1 , das nextVal wird sein:2
  4. Erzeugt die nächste allocationSize=5 Bezeichner, die den obigen Wert um 1 erhöhen, also:Id = 2, 3, 4, 5, 6

Wie Sie sehen können, wird dies einen doppelten Fehler verursachen.

Betrachten Sie nun bitte diesen Fall:

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

In diesem Fall Hibernate:

  1. Holt die erste Zahl aus der Sequenz - sagen wir mal NextVal = 1 und speichert es im Speicher
  2. Erzeugt die nächste allocationSize=5 Bezeichner, die den obigen Wert um 1 erhöhen, also:Id = 1, 2, 3, 4, 5
  3. Holt die nächste Zahl aus der Folge - wegen INCREMENT BY 5 , das nextVal wird sein:6
  4. Erzeugt die nächste allocationSize=5 Bezeichner, die den obigen Wert um 1 erhöhen, also:Id = 6, 7, 8, 9, 10

In diesem Fall gibt es keinen doppelten Fehler.

Der letzte Fall hat den Nachteil, dass wenn die Sequenz außerhalb von Hibernate verwendet wird, die Sequenz Lücken produziert.