Webアプリケーションのデータベース互換性の範囲を拡大しようとしています。私たちのアプリケーションは、JSP、サーブレット、およびEJBを備えたJava EEです。アプリケーションを互換にしようとしているデータベースはSQL Server 2008です。UNIQUE KEY制約違反。オブジェクトに重複キーを挿入できません
私たちが実行している問題は、ユーザーが特定の画面に複数のアップロード用のインターフェイスで複数のファイルを添付しようとすると発生します。ユーザーは最初のファイルを正常に添付することができ、データベースは正しく更新されます。ユーザーが2番目の添付ファイルを追加した後に更新しようとすると、[重複する値を挿入できません]というユニークキー制約違反エラーがスローされます。以下が出力されエラーです:するためにUQキー制約を維持するエンティティにコンストラクタを追加
- :
Violation of UNIQUE KEY constraint 'UQ__Key__8861A9F23EDC53F0'. Cannot insert duplicate key in object 'dbo.Entity'. org.hibernate.exception.ConstraintViolationException: could not insert: [foo.beans.eproc.entity.Entity]
は、これまでのところ、我々は問題を解決するには、以下を試してみましたユニークで非ヌルになるようにレコードを初期化します。これにより、他のキー制約違反に関する以前の問題が解決されました。
- DELETESの前にINSERTSを実行しているHibernateの問題を読んでいます。以前は、これがこの問題を引き起こしていると考えました。現在、更新プロセスの一環として、保存されているすべての添付ファイルが削除され、セッション内のすべての現在の添付ファイルがデータベースに追加されます。私たちの考えは、削除の前にINSERTを実際に実行しようとすると、添付ファイルでUQキーの違反をスローするよりも実行しようとしていたということでした。
- SQL ServerのUQキーを削除して2番目の添付ファイルを追加するだけで問題なくデータベースが更新され、レコードに一意でないデータは含まれていないように見えます。
残念ながら、[1]はUQキー違反がまだスローされているため問題を解決しませんでした。上記の[2]では、HiberanteがDELETESの前にINSERTSを実行していることを確認することができませんでした。次の質問へ
回答は、私たちはいくつかの進歩を遂げる役立つだろう:
- この問題に対する潜在的な解決策になるSQLサーバー内で一意のキーを削除してもらえますか?
- HibernateがDELETESの前にINSERTを実行しているかどうかを検証する方法はありますか?もしそうなら、私たちはそれをどのように確認するのでしょうか?
- 上記の場合にHibernateに問題がある場合、この問題をどのように解決できますか?
http://docs.jboss.org/hibernate/core/3。6/reference/en-US/html_single /#configuration-optional:hibernate.show_sql - すべてのSQL文をコンソールに書き出します。これは、ログカテゴリorg.hibernate.SQLをデバッグに設定する代わりの方法です。 –
エラーが発行された後にテーブル定義と一意キー列の値を確認すると便利です。 –