2012-02-13 62 views
0

Webアプリケーションのデータベース互換性の範囲を拡大しようとしています。私たちのアプリケーションは、JSP、サーブレット、およびEJBを備えたJava EEです。アプリケーションを互換にしようとしているデータベースはSQL Server 2008です。UNIQUE KEY制約違反。オブジェクトに重複キーを挿入できません

私たちが実行している問題は、ユーザーが特定の画面に複数のアップロード用のインターフェイスで複数のファイルを添付しようとすると発生します。ユーザーは最初のファイルを正常に添付することができ、データベースは正しく更新されます。ユーザーが2番目の添付ファイルを追加した後に更新しようとすると、[重複する値を挿入できません]というユニークキー制約違反エラーがスローされます。以下が出力されエラーです:するためにUQキー制約を維持するエンティティにコンストラクタを追加

  1. 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]

    は、これまでのところ、我々は問題を解決するには、以下を試してみましたユニークで非ヌルになるようにレコードを初期化します。これにより、他のキー制約違反に関する以前の問題が解決されました。

  2. DELETESの前にINSERTSを実行しているHibernateの問題を読んでいます。以前は、これがこの問題を引き起こしていると考えました。現在、更新プロセスの一環として、保存されているすべての添付ファイルが削除され、セッション内のすべての現在の添付ファイルがデータベースに追加されます。私たちの考えは、削除の前にINSERTを実際に実行しようとすると、添付ファイルでUQキーの違反をスローするよりも実行しようとしていたということでした。
  3. SQL ServerのUQキーを削除して2番目の添付ファイルを追加するだけで問題なくデータベースが更新され、レコードに一意でないデータは含まれていないように見えます。

残念ながら、[1]はUQキー違反がまだスローされているため問題を解決しませんでした。上記の[2]では、HiberanteがDELETESの前にINSERTSを実行していることを確認することができませんでした。次の質問へ

回答は、私たちはいくつかの進歩を遂げる役立つだろう:

  1. この問題に対する潜在的な解決策になるSQLサーバー内で一意のキーを削除してもらえますか?
  2. HibernateがDELETESの前にINSERTを実行しているかどうかを検証する方法はありますか?もしそうなら、私たちはそれをどのように確認するのでしょうか?
  3. 上記の場合にHibernateに問題がある場合、この問題をどのように解決できますか?
+0

http://docs.jboss.org/hibernate/core/3。6/reference/en-US/html_single /#configuration-optional:hibernate.show_sql - すべてのSQL文をコンソールに書き出します。これは、ログカテゴリorg.hibernate.SQLをデバッグに設定する代わりの方法です。 –

+0

エラーが発行された後にテーブル定義と一意キー列の値を確認すると便利です。 –

答えて

1

1)それは解決策になる可能性がありますが、一意の値を確保するために制約が必要な場合は、それを失います。また、価値があるため、クエリー・オプティマイザーが固有の制約を使用してクエリーをより速く実行させるため、データの整合性と同様にパフォーマンスが低下する可能性があります。

2)nhibernate監視ツールがありますが、TSQL監視ツールもあります。 SQL SErver 2008以上を使用している場合は、拡張イベントセッションを実行し、rpc completeおよびsql batch completeイベントを通じて呼び出されたクエリを取得します。 SQL Server 2005 &以前は、Profilerを使用して設定したサーバー側のトレースでもこれを実行できます。

3)残念ながらここでコメントするには十分な休止状態を知らない。

関連する問題