2017-12-13 7 views
0

Wir haben eine Anwendung, die seit Jahren funktioniert, und wir verwenden auch die gleiche Oracle-Datenbank. Aber migrierte unsere Datenbank von einem Host zu einem anderen Host.Eindeutige Einschränkung verletzt - Debug

DB: ORACLE

Jetzt ganz plötzlich wir folgende Ausnahme erhalten,

“org.springframework.dao.DataIntegrityViolationException: ORA-00001: unique constraint (YYY.XXX_LOG_PK) violated; 
SQL [n/a]; constraint [YYY.XXX_LOG_PK]; nested exception is org.hibernate.exception.ConstraintViolationException: ORA-00001: unique constraint (YYY.XXX_LOG_PK) violated” 

Code:

@SequenceGenerator(name = "TT_SEQUENCE_GENERATOR", sequenceName = "YYY.XXX_LOG_SEQ") 
@Id 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "TT_SEQUENCE_GENERATOR") 
@Column(name = "ID") 
public Long getId() { 
    return this.id; 
} 

Sequenz in DB:

CREATED 07-NOV-17 
LAST_DDL_TIME 07-NOV-17 
SEQUENCE_OWNER TT 
SEQUENCE_NAME YYY.XXX_LOG_SEQ 
MIN_VALUE 1 
MAX_VALUE 999999999999999999999999999 
INCREMENT_BY 1 
CYCLE_FLAG N 
ORDER_FLAG N 
CACHE_SIZE 0 
LAST_NUMBER 75305 

Problem : Wenn wir versuchen, einen Datensatz durch JPA-Code einzufügen, erhalten wir die obige Ausnahme, aber wenn ich versuche, einige Datensätze mit sequence.nextval in die DB einzufügen, gibt es keine Ausnahme.

Gibt es sowieso ich kann debuggen, um herauszufinden, was die Ausnahme wäre? Ich habe auch versucht, show_sql - ich konnte nicht die Lösung mit diesem auch zu finden, da dies nicht die nächste Sequenznummer in der Konsole

drucken Bitte zeigen Sie mich in die richtige Richtung, wenn Sie die Lösung kennen.

+0

Dass der Fehler nicht bei unformatierten Einfügungen auf Ihrer Oracle-Datenbank auftritt, macht dieses Problem noch heimtückischer. Besteht die Möglichkeit, dass Hibernate hinter den Kulissen eine oder mehrere Junction-Tabellen erstellt und dass der Fehler tatsächlich auftritt? –

+0

Ich glaube nicht, dass es eine Chance gibt, Hibernate mehrere Male aufzurufen .... Aber der richtige Punkt, ich werde es überprüfen, indem Sie show_sql platzieren. – abc

Antwort

2

Das häufigste Szenario, in dem eine selbstverstärkte Sequenz einen Konflikt mit einer eindeutigen Integritätsbedingung feststellt, ist die Migration der Daten, die dazu führt, dass der maximale Wert der Daten den Sequenzwert überschreitet. Abfrage

Zum einen die sequanence aktuellen Werte:

SELECT seqname.CURRVAL FROM dual 

Und dann die Sequenz Wert ändern die aktuelle Maximalwert der Daten der nextval der Folge überschreitet, um sicherzustellen.

ALTER SEQUENCE seqname INCREMENT BY XXXXXX; 
SELECT seqname.NEXTVAL FROM dual; 
+0

CURRVAL gibt nur den letzten Wert eines vorherigen NEXTVAL-Anrufs in derselben Sitzung zurück. Wir müssten den tatsächlichen Wert von ALL_SEQUENCES.LAST_NUMBER überprüfen. – APC

0

fand ich die Lösung für das Problem, das wir konfrontiert.

Das Problem ist von der Datenbank Ende. Wir haben das gefunden, indem wir die Migrationsdokumente überprüft und die Dateien überprüft haben.

@Edwin: Danke für Ihre Hilfe, Ihre Abfrage half mir auch bei der Suche, wo das Problem liegt.

Während der Migration wurden die Sequenzen nicht vom alten Server auf den neuen Server kopiert. Als wir auf den neuen Server kopiert haben, hat alles gut funktioniert.

Danke an alle.

Verwandte Themen