sql >> Databáze >  >> RDS >> Oracle

javax.persistence.EntityExistsException s SequenceGenerator

allocationSize parametr musí odpovídat parametru INCREMENT BY hodnota sekvence.

Funguje to tak, že Hibernate získá hodnotu ze sekvence (z databáze) a poté tuto hodnotu uchová v paměti a vygeneruje dalších X následných identifikátorů (kde X=allocationSize), které tuto hodnotu zvýší o 1 v paměti, aniž by sáhnout po databázi.

Jakmile Hibernate vygeneruje X identifikátory, získá další hodnotu ze sekvence a vygeneruje nové X identifikátory, přičemž tuto hodnotu zvýší o 1

Jednoduchý příklad – řekněme, že:

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

Ve výše uvedeném případě Hibernate:

  1. Načte první číslo ze sekvence – řekněme NextVal = 1 a uloží jej do paměti
  2. Vygeneruje další allocationSize=5 identifikátory zvyšující výše uvedenou hodnotu o 1, tj.:Id = 1, 2, 3, 4, 5
  3. Načte další číslo ze sekvence – kvůli INCREMENT BY 1 , nextVal bude:2
  4. Vygeneruje další allocationSize=5 identifikátory zvyšující výše uvedenou hodnotu o 1, tj.:Id = 2, 3, 4, 5, 6

Jak vidíte, způsobí to duplicitní chybu.

Nyní zvažte tento případ:

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

V tomto případě Hibernate:

  1. Načte první číslo ze sekvence – řekněme NextVal = 1 a uloží jej do paměti
  2. Vygeneruje další allocationSize=5 identifikátory zvyšující výše uvedenou hodnotu o 1, tj.:Id = 1, 2, 3, 4, 5
  3. Načte další číslo ze sekvence – kvůli INCREMENT BY 5 , nextVal bude:6
  4. Vygeneruje další allocationSize=5 identifikátory zvyšující výše uvedenou hodnotu o 1, tj.:Id = 6, 7, 8, 9, 10

V tomto případě se nejedná o duplicitní chybu.

Poslední případ má tu nevýhodu, že pokud je sekvence použita mimo Hibernate, bude sekvence vytvářet mezery.




  1. Kopírování dat mezi různými databázemi (obě jsou podporovány jdbc)

  2. Změňte funkci s hodnotou tabulky na serveru SQL Server

  3. Nelegální použití datového typu LONG Oracle

  4. Spojení více stolů bez společného klíče