Domanda

Sto usando la sequenza per il salvataggio dell'istanza dell'oggetto di dominio nel mio database Oracle. Ho una sequenza per ogni tabella nel database. Quando utilizzo la funzionalità Salva sull'utente o sulla risorsa, ad esempio, ha creato una nuova risorsa in prima prova, ma l'ID utilizzato era 70?La sequenza mostra il numero successivo corretto - 42 poiché l'ID massimo nella tabella è 41. Perché ID= 70 è stato utilizzato per inserire la nuova risorsa?

Anche dal prossimo prova tutti gli inserti falliscono con questo errore

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
.

Non è sicuro che cosa è sbagliato perché questo sta accadendo dopo la ristrutturazione del codice ... dove abbiamo spostato il codice in nuovi pacchetti ..

Modifica: ho scoperto la causa, consulta la mia risposta .. Grazie ragazzi

È stato utile?

Soluzione 4

Ho realizzato la causa principale del problema. In precedenza avevo usato la sequencepertableracleelect, ne ho capito da uno dei post precedenti di Burt Beckwith. Il dialetto crea una nuova sequenza per ogni tabella quando l'applicazione sta avviando, simile alla classe di dominio convertita in tabella. Il dialetto assicura inoltre che ogni sequenza di identificazione delle tabelle sia gestita solo attraverso la sua sequenza e una sequenza comune non viene utilizzata per tutti gli inserti nel database (che è la strategia predefinita) Durante la ristrutturazione del codice avevo rimosso il dialetto personalizzato e stava usando il dialetto di 10 g predefinito.

Questo è ciò che stava causando il problema!

Vedo il numero successivo nelle tabelle associata al campo Valore successivo della sequenza, che dove vengo a sapere che la prossima Val= 42 per risorsa_seguenze che è giusta poiché Max (ID) nella tabella delle risorse è 41.

Grazie mille ragazzi per l'intuizione che in qualche modo aiutami a ricordare la causa reale! Per coloro che hanno bisogno di sapere di più sul dialetto personalizzato, è qui

Altri suggerimenti

Le sequenze possono rifiutare i numeri, cioè ogni record in una tabella non sarà necessariamente uno dopo il prossimo senza lacune.In altre parole, il fatto che il tuo sia saltato a 70 anche se il precedente record DB aveva ID= 41 non indica un problema.

.

Dal momento che il Max ID nella tabella è 41

Sequenze non vedono il valore massimo della tabella e ottenere quello successivo.Archiviano il numero sequenziale corrente e utilizzerai il valore successivo.

È possibile controllare il numero effettivo con:

select mysequence.currval from dual
.

Il tuo problema è con il vincolo GRA.SYS_C0012183.Guarda cosa si verifica, e se questa è la tua chiave primaria, forse puoi usare un nome più leggibile, come my_table_pk ...

è SYS_C0012183 il vincolo della chiave principale?Non è definito solo la colonna id (che è, presumo, la colonna popolata dalla sequenza)?

    .
  • Come si determina che il prossimo valore della sequenza è 42?Stai eseguendo una query separata per questo?
  • Ti aspetti la sequenza per darti numeri privi di gap?Se è così, questo è un problema con le tue aspettative.Le sequenze ritornano i valori distinti ma non garantiscono che non ci saranno lacune (infatti, è possibile garantire che ci saranno lacune perché il database si spegne o la sequenza è stata eliminata dal pool condiviso o una transazione è stata ritornata).
  • Come usi la sequenza?C'è un trigger sul tavolo?Oppure è ibernazione configurata per utilizzare la sequenza?Se ibernazione è configurato per utilizzare la sequenza, pubblica quella configurazione.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top