Oracle
 sql >> база данни >  >> RDS >> Oracle

javax.persistence.EntityExistsException с SequenceGenerator

allocationSize параметърът трябва да съответства на INCREMENT BY стойност на последователността.

Работи по такъв начин, че Hibernate получава стойност от последователността (от базата данни) и след това запазва тази стойност в паметта и генерира следващите X последващи идентификатори (където X=allocationSize), увеличавайки тази стойност с 1 в паметта, без достигане до базата данни.

След като Hibernate генерира X идентификатори, той получава следващата стойност от последователността и генерира нови X идентификатори, увеличавайки тази стойност с 1

Един прост пример - да кажем, че:

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

В горния случай Хибернация:

  1. Извлича първото число от поредицата - да кажем NextVal = 1 и го съхранява в паметта
  2. Генерира следващ allocationSize=5 идентификатори, увеличаващи горната стойност с 1, тоест:Id = 1, 2, 3, 4, 5
  3. Извлича следващото число от поредицата - поради INCREMENT BY 1 , nextVal ще бъде:2
  4. Генерира следващ allocationSize=5 идентификатори, увеличаващи горната стойност с 1, тоест:Id = 2, 3, 4, 5, 6

Както можете да видите, това ще доведе до дублирана грешка.

Сега, моля, разгледайте този случай:

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

В този случай Хибернация:

  1. Извлича първото число от поредицата - да кажем NextVal = 1 и го съхранява в паметта
  2. Генерира следващ allocationSize=5 идентификатори, увеличаващи горната стойност с 1, тоест:Id = 1, 2, 3, 4, 5
  3. Извлича следващото число от поредицата - поради INCREMENT BY 5 , nextVal ще бъде:6
  4. Генерира следващ allocationSize=5 идентификатори, увеличаващи горната стойност с 1, тоест:Id = 6, 7, 8, 9, 10

В този случай няма дублирана грешка.

Последният случай има недостатъка, че ако последователността се използва извън Hibernate, тогава последователността ще създаде пропуски.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle Комбинирайте няколко колони в една

  2. В Oracle 11g как определяте средното тегло на данните на час между две дати?

  3. грешен брой или типове аргументи при извикване на Stored Proc

  4. SSIS преобразува Varchar2 в DT_STR

  5. PHP PDO инсталация на windows (xampp)