Oracle
 sql >> Database >  >> RDS >> Oracle

javax.persistence.EntityExistsException con SequenceGenerator

allocationSize il parametro deve corrispondere a INCREMENT BY valore della sequenza.

Funziona in modo tale che Hibernate ottenga un valore dalla sequenza (dal database), quindi mantenga quel valore in memoria e generi i successivi X identificatori successivi (dove X=allocationSize) incrementando questo valore di 1 nella memoria, senza raggiungendo il database.

Una volta che Hibernate genera identificatori X, ottiene il valore successivo dalla sequenza e genera nuovi identificatori X, incrementando quel valore di 1

Un semplice esempio - diciamo che:

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

Nel caso precedente, ibernazione:

  1. Recupera il primo numero dalla sequenza - diciamo NextVal = 1 e lo salva in memoria
  2. Genera allocationSize=5 successivo identificatori incrementando di 1 il valore sopra, ovvero:Id = 1, 2, 3, 4, 5
  3. Recupera il numero successivo dalla sequenza - a causa di INCREMENT BY 1 , il nextVal sarà:2
  4. Genera allocationSize=5 successivo identificatori incrementando di 1 il valore sopra, ovvero:Id = 2, 3, 4, 5, 6

Come puoi vedere, causerà un doppio errore.

Ora, per favore, considera questo caso:

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

In questo caso ibernazione:

  1. Recupera il primo numero dalla sequenza - diciamo NextVal = 1 e lo salva in memoria
  2. Genera allocationSize=5 successivo identificatori incrementando di 1 il valore sopra, ovvero:Id = 1, 2, 3, 4, 5
  3. Recupera il numero successivo dalla sequenza - a causa di INCREMENT BY 5 , il nextVal sarà:6
  4. Genera allocationSize=5 successivo identificatori incrementando di 1 il valore sopra, ovvero:Id = 6, 7, 8, 9, 10

In questo caso non ci sono errori duplicati.

L'ultimo caso presenta lo svantaggio che se la sequenza viene utilizzata al di fuori di Hibernate, la sequenza produrrà delle lacune.