Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

javax.persistence.EntityExistsException com SequenceGenerator


allocationSize O parâmetro deve corresponder ao INCREMENT BY valor da sequência.


Ele funciona de tal forma que o Hibernate obtém um valor da sequência (do banco de dados), e então mantém esse valor na memória e gera os próximos X identificadores subsequentes (onde X=allocationSize) incrementando esse valor em 1 na memória, sem alcançando o banco de dados.


Uma vez que o Hibernate gera identificadores X, ele obtém o próximo valor da sequência e gera novos identificadores X, incrementando esse valor em 1

Um exemplo simples - digamos que:
  • @SequenceGenerator( ....allocationSize=5 ...)
  • CREATE SEQUENCE .... INCREMENT BY 1 ...

No caso acima Hibernate:
  1. Busca o primeiro número da sequência - digamos NextVal = 1 e armazena na memória
  2. Gera o próximo allocationSize=5 identificadores incrementando o valor acima em 1, ou seja:Id = 1, 2, 3, 4, 5
  3. Busca o próximo número da sequência - devido a INCREMENT BY 1 , o nextVal será:2
  4. Gera o próximo allocationSize=5 identificadores incrementando o valor acima em 1, ou seja:Id = 2, 3, 4, 5, 6

Como você pode ver, isso causará um erro duplicado.

Agora, considere este caso:
  • @SequenceGenerator( ....allocationSize=5 ...)
  • CREATE SEQUENCE .... INCREMENT BY 5 ...

Neste caso, hibernar:
  1. Busca o primeiro número da sequência - digamos NextVal = 1 e armazena na memória
  2. Gera o próximo allocationSize=5 identificadores incrementando o valor acima em 1, ou seja:Id = 1, 2, 3, 4, 5
  3. Busca o próximo número da sequência - devido a INCREMENT BY 5 , o nextVal será:6
  4. Gera o próximo allocationSize=5 identificadores incrementando o valor acima em 1, ou seja:Id = 6, 7, 8, 9, 10

Neste caso, não há erro duplicado.

O último caso tem a desvantagem de que, se a sequência for usada fora do Hibernate, a sequência produzirá lacunas.