sql >> Base de Datos >  >> RDS >> Oracle

javax.persistencia.EntityExistsException con SequenceGenerator

allocationSize el parámetro debe coincidir con INCREMENT BY valor de la secuencia.

Funciona de tal manera que Hibernate obtiene un valor de la secuencia (de la base de datos), y luego mantiene ese valor en la memoria y genera los siguientes X identificadores posteriores (donde X=allocationSize) incrementando este valor en 1 en la memoria, sin buscando la base de datos.

Una vez que Hibernate genera identificadores X, obtiene el siguiente valor de la secuencia y genera nuevos identificadores X, incrementando ese valor en 1

Un ejemplo simple, digamos que:

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

En el caso anterior, Hibernate:

  1. Obtiene el primer número de la secuencia, digamos NextVal = 1 y lo almacena en la memoria
  2. Genera el siguiente allocationSize=5 identificadores que incrementan el valor anterior en 1, es decir:Id = 1, 2, 3, 4, 5
  3. Obtiene el siguiente número de la secuencia - debido a INCREMENT BY 1 , el nextVal será:2
  4. Genera el siguiente allocationSize=5 identificadores que incrementan el valor anterior en 1, es decir:Id = 2, 3, 4, 5, 6

Como puede ver, provocará un error duplicado.

Ahora considere este caso:

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

En este caso Hibernate:

  1. Obtiene el primer número de la secuencia, digamos NextVal = 1 y lo almacena en la memoria
  2. Genera el siguiente allocationSize=5 identificadores que incrementan el valor anterior en 1, es decir:Id = 1, 2, 3, 4, 5
  3. Obtiene el siguiente número de la secuencia - debido a INCREMENT BY 5 , el nextVal será:6
  4. Genera el siguiente allocationSize=5 identificadores que incrementan el valor anterior en 1, es decir:Id = 6, 7, 8, 9, 10

En este caso no hay error de duplicado.

El último caso tiene la desventaja de que si la secuencia se usa fuera de Hibernate, la secuencia producirá espacios.