Oracle
 sql >> Baza danych >  >> RDS >> Oracle

javax.persistence.EntityExistsException z SequenceGenerator

allocationSize parametr musi być zgodny z INCREMENT BY wartość ciągu.

Działa w ten sposób, że Hibernate pobiera wartość z sekwencji (z bazy danych), a następnie utrzymuje ją w pamięci i generuje kolejne X kolejnych identyfikatorów (gdzie X=rozmiar alokacji) zwiększając tę ​​wartość o 1 w pamięci, bez sięganie po bazę danych.

Gdy Hibernate wygeneruje identyfikatory X, pobiera następną wartość z sekwencji i generuje nowe identyfikatory X, zwiększając tę ​​wartość o 1

Prosty przykład - powiedzmy, że:

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

W powyższym przypadku Hibernacja:

  1. Pobiera pierwszą liczbę z sekwencji — powiedzmy NextVal = 1 i przechowuje go w pamięci
  2. Generuje następny allocationSize=5 identyfikatory zwiększające powyższą wartość o 1, czyli:Id = 1, 2, 3, 4, 5
  3. Pobiera kolejną liczbę z sekwencji — z powodu INCREMENT BY 1 , nextVal będzie:2
  4. Generuje następny allocationSize=5 identyfikatory zwiększające powyższą wartość o 1, czyli:Id = 2, 3, 4, 5, 6

Jak widać, spowoduje to zduplikowany błąd.

Rozważ teraz ten przypadek:

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

W tym przypadku Hibernacja:

  1. Pobiera pierwszą liczbę z sekwencji — powiedzmy NextVal = 1 i przechowuje go w pamięci
  2. Generuje następny allocationSize=5 identyfikatory zwiększające powyższą wartość o 1, czyli:Id = 1, 2, 3, 4, 5
  3. Pobiera następną liczbę z sekwencji — z powodu INCREMENT BY 5 , nextVal będzie:6
  4. Generuje następny allocationSize=5 identyfikatory zwiększające powyższą wartość o 1, czyli:Id = 6, 7, 8, 9, 10

W tym przypadku nie ma duplikatu błędu.

Ostatni przypadek ma tę wadę, że jeśli sekwencja jest używana poza Hibernate, to sekwencja będzie generować przerwy.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wyzwalacz, który wstawia wiersz do tabeli dziennika podczas wstawiania lub usuwania w tabeli osób skompilowanej z błędami

  2. FROM_TZ() Funkcja w Oracle

  3. Funkcja NLS_UPPER() w Oracle

  4. Ustawienia limitu czasu połączenia dla bazy danych Oracle

  5. Funkcja Concat nie działa - nieprawidłowa liczba argumentów