2012-11-05 10 views
11

私はすべての列がnullでないと定義されているmysqlテーブルに挿入するために、hibernateを使用しています。ユニークな主キーと複数の列にユニークな索引があります。org.springframework.dao.DataIntegrityViolationException誤った報告の原因ですか?

私は次のエラーを取得しています:

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

このエラーは、顧客のログにあると私は問題を自分で再現することはできませんので、私は値がでているものを見るために、デバッグ中に置くことができませんinsertステートメント

「constraint [null]」は、「not null」制約が違反されていることを意味します。しかし、私のコードを見ると、hibernateがヌルIDを挿入しようとしていない限り、挿入時にデータがヌルになる可能性のある方法を見ることができません(これは、休止状態では非常に悪いバグでしょう。ありそうもない)。

しかし、ユニークな制約が違反している可能性があります。メッセージが誤解を招く可能性がありますか?実際には、固有のキー違反が発生していますか? "constraint [null]"は常にnullでない制約が違反したことを意味しますか?

+0

私は 'null'なのでないカラムが' null'なので価値を与えるしようとされていない限り、その例外が発生した理由を推測することができないなどのDB名が付いています。ところで、古いバージョンのJDBCドライバを使用している場合は、最新のもの(10 +)で置き換えることを忘れないでください。それ以外の場合は、後で他の問題が発生します。 – Lion

+0

これはOracleではなく、mysql 5.1です。 – Dana

答えて

11

あなたは春のソースコード内のDataIntegrityViolationExceptionのコンストラクタの呼び出し元を検索する場合、あなたはそれがorg.springframework.orm.hibernate3.SessionFactoryUtilsで呼ばれていますことを見つけることができます:

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

だから、例外が違反制約によって引き起こされる、とnull JDBC例外によって返される制約の名前です。したがって、違反した制約名にJDBC例外を設定しないようにMySQLドライバを非難する必要があります。しかし、違反した制約は制約であり、必ずしもnot nullという制約ではありません。

+1

私は、mysqlが名前を与えているのではなく、知っていると非常に役立つことは非常に面倒です!私はnullがnullでないことを意味すると仮定しました。ありがとう。 – Dana

1

あなたは、Hibernateの例外タイプから直接Constain名を得ることができます。 use

getConstraintName

DB制約名を取得するプロパティです。

} catch (ConstraintViolationException conEx) { 
      if (conEx.getConstraintName().contains("PROJECT_UK")) { 
       //TODO Project Entity is violating it's constrain 

このアプリケーションを複数のDBスキーマで実行したいので、私はcontainsを使用しました。デフォルトではgetConstraintNameは

MyDBName.ConstrainName

+0

ConstraintViolationExceptionにgetConstraintName()メソッドがなくなりました。 – Anna

関連する問題