Frage

Ich verwende die Sequenz zum Speichern der Domänenobjektinstanz in meiner Oracle-Datenbank.Ich habe eine Sequenz für jede Tabelle in der Datenbank.wenn ich beispielsweise die Speicherfunktion für Benutzer oder Ressourcen verwende, wurde beim ersten Versuch eine neue Ressource erstellt, aber die verwendete ID war 70?die Sequenz zeigt die richtige nächste Nummer - 42, da die maximale ID in der Tabelle 41 ist.warum wurde id = 70 zum Einfügen der neuen Ressource verwendet?

Auch beim nächsten Versuch schlagen alle Einfügungen mit diesem Fehler fehl

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

Ich bin mir nicht sicher, was falsch ist, da dies nach einer Code-Umstrukturierung geschieht...wo wir Code in neue Pakete verschoben haben..

Bearbeiten:Ich habe die Ursache herausgefunden, siehe meine Antwort..Danke Jungs

War es hilfreich?

Lösung 4

Ich habe die Hauptursache des Problems erkannt. Ich hatte zuvor den SequencePerceTableRocleLedialect benutzt, ich habe das von einem der vorherigen Beiträge von Burt Beckwith. Der Dialekt erstellt für jede Tabelle eine neue Sequenz, wenn die Anwendung startet, ähnlich wie in der Tabelle umgewandelte Domain-Klasse. Der Dialekt stellt auch sicher, dass jeder Tabellen-ID-Sequenz nur durch seine Reihenfolge verwaltet wird und eine gemeinsame Sequenz nicht für alle Einsätze in der Datenbank verwendet wird (die Standardstrategie ist) Während der Code-Restrukturierung hatte ich den benutzerdefinierten Dialekt entfernt und verwendet den Standardwert 10g-Dialekt.

das ist das, was das Problem verursacht hat!

Ich sehe die nächste Nummer in den TABLES zugeordneten Sequenz des nächsten Werts des nächsten Werts, an der ich erfahren kann, dass das nächste Val= 42 für Ressource_Sequence, das sich recht hat, da max (ID) in der Ressourcentabelle 41 ist.

Vielen Dank an viel Jungs für die Erkenntnis, die mir in gewisser Weise helfen, die eigentliche Sache zu erinnern! Für diejenigen, die mehr über den benutzerdefinierten Dialekt erfahren müssen, Es ist hier

Andere Tipps

Sequenzen können Zahlen abgeben, d. H. Jeder Datensatz in einer Tabelle ist nicht unbedingt eines nach dem nächsten ohne Lücken.Mit anderen Worten, die Tatsache, dass Ihre zu 70 sprang, obwohl der vorherige DB-Datensatz id= 41 hatte, zeigt kein Problem an.

da die maximale ID in der Tabelle 41 ist

Sequenzen sehen den Maximalwert der Tabelle nicht und erhalten den nächsten.Sie speichern die aktuelle fortlaufende Nummer und Sie verwenden den nächsten Wert.

Sie können die tatsächliche Nummer mit überprüfen:

select mysequence.currval from dual

Dein Problem ist mit dem GRA.SYS_C0012183 Einschränkung.Sehen Sie, was dies überprüft, und wenn dies Ihr Primärschlüssel ist, können Sie möglicherweise einen besser lesbaren Namen verwenden, z. B. MY_TABLE_PK ...

Is SYS_C0012183 die Primärschlüsseleinschränkung?Ist es definiert nicht nur die id spalte (das ist, nehme ich an, die Spalte, die mit der Sequenz gefüllt ist)?

  • Wie bestimmen Sie, dass der nächste Wert der Sequenz 42 ist?Führen Sie dafür eine separate Abfrage aus?
  • Erwarten Sie, dass die Sequenz Ihnen lückenlose Zahlen liefert?Wenn ja, ist das ein Problem mit Ihren Erwartungen.Sequenzen geben unterschiedliche Werte zurück, garantieren jedoch nicht, dass keine Lücken vorhanden sind (tatsächlich können Sie sicher sein, dass Lücken vorhanden sind, weil die Datenbank heruntergefahren oder die Sequenz aus dem gemeinsam genutzten Pool gelöscht oder eine Transaktion zurückgesetzt wurde).
  • Wie benutzt du die Sequenz?Liegt ein Auslöser auf dem Tisch?Oder ist der Ruhezustand für die Verwendung der Sequenz konfiguriert?Wenn der Ruhezustand für die Verwendung der Sequenz konfiguriert ist, veröffentlichen Sie diese Konfiguration.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top