2012-11-05 7 views
11

Ich verwende Hibernate, um in eine MySQL-Tabelle einzufügen, in der alle Spalten als nicht null definiert sind. Es hat einen eindeutigen Primärschlüssel und einen anderen eindeutigen Index für mehrere Spalten.org.springframework.dao.DataIntegrityViolationException falsche bericht Ursache?

Ich erhalte die folgende Fehlermeldung:

org.springframework.dao.DataIntegrityViolationException: Could not execute JDBC batch update; SQL [insert into MY_TABLE(col1, col2, col3, col4, ID_) values (?, ?, ?, ?, ?)]; constraint [null]

Dieser Fehler in der Kundenprotokolle und ich kann das Problem nicht selbst reproduzieren, so kann ich bei der Fehlersuche, um zu sehen, was die Werte nicht gesetzt sind in die Insert-Anweisung.

Mein Verständnis ist, dass "Constraint [null]" bedeutet, dass eine "nicht null" Einschränkung verletzt wird. Wenn ich jedoch meinen Code betrachte, kann ich keine Möglichkeit erkennen, dass irgendwelche Daten zum Zeitpunkt des Einfügens null sein könnten, es sei denn, Hibernate versucht, eine Null-ID einzufügen (was ein sehr schlechter Fehler im Hibernate wäre) unwahrscheinlich).

Ich kann jedoch sehen, wie es passieren kann, dass eine eindeutige Einschränkung verletzt wird. Ist es möglich, dass die Nachricht irreführend ist und ich tatsächlich eine eindeutige Schlüsselverletzung erhalte? Bedeutet "constraint [null]" immer, dass eine Nicht-Null-Bedingung verletzt wurde?

+0

Ich kann nicht erraten, warum diese Ausnahme verursacht wird, es sei denn, ein 'nicht null' Spalte einen' null' Wert zu geben versucht. Übrigens, wenn Sie eine ältere Version des JDBC-Treibers verwenden, dann vergessen Sie nicht, sie durch die neueste Version (10+) zu ersetzen. Andernfalls werden später auch andere Probleme verursacht. – Lion

+0

Dies ist MySQL 5.1, nicht Oracle. – Dana

Antwort

11

Wenn Sie den Anrufer des Konstrukteurs von DataIntegrityViolationException im Frühjahr Quellcode suchen, werden Sie feststellen, dass es in org.springframework.orm.hibernate3.SessionFactoryUtils genannt:

return new DataIntegrityViolationException(ex.getMessage() + "; SQL [" + jdbcEx.getSQL() + 
       "]; constraint [" + jdbcEx.getConstraintName() + "]", ex); 

So ist die Ausnahme von einem verletzten Zwang verursacht wird, und null ist der Name der Einschränkung, die von der JDBC-Ausnahme zurückgegeben wird. Sie sollten also den MySQL-Treiber beschuldigen, dass er den Namen der verletzten Constraint in der JDBC-Ausnahme nicht gefüllt hat. Die verletzte Einschränkung könnte jedoch jede Einschränkung und nicht notwendigerweise eine not null Einschränkung sein.

+1

Ich sehe, das ist sehr ärgerlich, dass mysql nicht den Namen gibt, aber sehr hilfreich zu wissen! Ich habe einfach angenommen, dass der Nullwert eine Nicht-Null-Einschränkung bedeutet. Vielen Dank. – Dana

1

Sie können den Namen Conform direkt aus Hibernate Exception-Typ abrufen. Verwendung

getConstraintName

Eigenschaft erhalten DB Namen beschränken.

Ich habe verwendet, weil ich möchte, dass diese App auf mehreren DB-Schemas ausgeführt wird. Standardmäßig kommt getConstraintName mit DB-Namen wie

MyDBName.ConstrainName

+0

Es gibt keine getConstraintName() -Methode mehr in ConstraintViolationException – Anna

Verwandte Themen