Oracle
 sql >> Base de données >  >> RDS >> Oracle

javax.persistence.EntityExistsException avec SequenceGenerator

allocationSize le paramètre doit correspondre à INCREMENT BY valeur de la séquence.

Cela fonctionne de telle manière qu'Hibernate obtient une valeur de la séquence (de la base de données), puis conserve cette valeur dans la mémoire et génère les prochains X identifiants suivants (où X=allocationSize) en incrémentant cette valeur de 1 dans la mémoire, sans accéder à la base de données.

Une fois qu'Hibernate a généré des identifiants X, il obtient la valeur suivante de la séquence et génère de nouveaux identifiants X, en incrémentant cette valeur de 1

Un exemple simple - disons que :

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

Dans le cas ci-dessus Hibernation :

  1. Récupère le premier nombre de la séquence - disons NextVal = 1 et le stocke dans la mémoire
  2. Génère la prochaine allocationSize=5 identifiants incrémentant la valeur ci-dessus de 1, soit :Id = 1, 2, 3, 4, 5
  3. Récupère le numéro suivant de la séquence - en raison de INCREMENT BY 1 , le nextVal sera :2
  4. Génère la prochaine allocationSize=5 identifiants incrémentant la valeur ci-dessus de 1, soit :Id = 2, 3, 4, 5, 6

Comme vous pouvez le voir, cela entraînera une erreur en double.

Veuillez maintenant considérer ce cas :

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

Dans ce cas Hiberner :

  1. Récupère le premier nombre de la séquence - disons NextVal = 1 et le stocke dans la mémoire
  2. Génère la prochaine allocationSize=5 identifiants incrémentant la valeur ci-dessus de 1, soit :Id = 1, 2, 3, 4, 5
  3. Récupère le numéro suivant de la séquence - en raison de INCREMENT BY 5 , le nextVal sera :6
  4. Génère la prochaine allocationSize=5 identifiants incrémentant la valeur ci-dessus de 1, soit :Id = 6, 7, 8, 9, 10

Dans ce cas, il n'y a pas d'erreur de doublon.

Le dernier cas a l'inconvénient que si la séquence est utilisée en dehors d'Hibernate, alors la séquence produira des trous.