Pergunta

Estou usando a sequência para salvar a instância do objeto de domínio em meu banco de dados Oracle.Tenho uma sequência para cada tabela do banco de dados.quando uso a funcionalidade de salvar em Usuário ou Recurso, por exemplo, ele criou um novo recurso na primeira tentativa, mas o ID usado foi 70?a sequência mostra o próximo número adequado - 42, pois o ID máximo na tabela é 41.por que id=70 foi usado para inserir o novo recurso?

Além disso, na próxima tentativa, todas as inserções falharão com este erro

org.springframework.dao.DataIntegrityViolationException: Could not execute JDBC batch update; SQL [insert into GRARESOURCE (decomm
issioned, disabled, criticality, resourceClass, resourceGroupId, resourceName, ownerId, resourceSegmentId, resourceTypeId, riskSco
re, targetIP, id) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)]; constraint [GRA.SYS_C0012183]; nested exception is org.hibernate.e
xception.ConstraintViolationException: Could not execute JDBC batch update

Não tenho certeza do que está errado porque isso está acontecendo após a reestruturação do código ... onde movemos o código para novos pacotes.

Editar:Eu descobri a causa, veja minha resposta..Obrigado pessoal

Foi útil?

Solução 4

Percebi a principal causa do problema.Eu já havia usado o SequencePerTableOracleDialect, aprendi isso em um dos posts anteriores de Burt Beckwith.O dialeto cria uma nova sequência para cada tabela quando a aplicação é inicializada, semelhante à classe de domínio convertida em tabela.O dialeto também garante que cada sequência de ID das tabelas seja gerenciada apenas por meio de sua sequência e uma sequência comum não seja usada para todas as inserções no banco de dados (que é a estratégia padrão) durante a reestruturação do código que eu havia removido o dialeto personalizado e estava usando o dialeto 10G padrão.

Isso é o que estava causando o problema!

Vejo o próximo número no próximo campo de valor da sequência associada às tabelas, onde fico sabendo que o próximo val = 42 para resource_sequence que está certo, já que max(id) na tabela de recursos é 41.

Muito obrigado pessoal pelo insight que de alguma forma me ajuda a lembrar a verdadeira causa!Para aqueles que precisam saber mais sobre o dialeto personalizado, seu Aqui

Outras dicas

As sequências podem desperdiçar números, ou seja,cada registro em uma tabela não será necessariamente um após o outro sem lacunas.Em outras palavras, o fato de o seu ter saltado para 70, embora o registro anterior do banco de dados tivesse ID=41, não indica um problema.

já que o ID máximo na tabela é 41

As sequências não veem o valor máximo da tabela e pegam o próximo.Eles armazenam o número sequencial atual e você usará o próximo valor.

Você pode verificar o número real com:

select mysequence.currval from dual

Seu problema é com o GRA.SYS_C0012183 limitação.Veja o que isso verifica e se esta for sua chave primária, talvez você possa usar algum nome mais legível, como MY_TABLE_PK...

É SYS_C0012183 a restrição de chave primária?Está definido não apenas o id coluna (que é, presumo, a coluna preenchida pela sequência)?

  • Como você determina que o próximo valor da sequência é 42?Você está executando uma consulta separada para isso?
  • Você espera que a sequência forneça números sem lacunas?Nesse caso, isso é um problema com suas expectativas.As sequências retornam valores distintos, mas não garantem que não haverá lacunas (na verdade, você pode ter certeza de que haverá lacunas porque o banco de dados foi encerrado ou a sequência foi eliminada do pool compartilhado ou uma transação foi revertida).
  • Como você usa a sequência?Existe um gatilho na mesa?Ou o Hibernate está configurado para usar a sequência?Se o Hibernate estiver configurado para usar a sequência, publique essa configuração.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top