5

以下は使用例です。A、B、C の 3 つの列で定義された一意のインデックスがあります。それらの値が A1、B1、C1 であるとします。私のJavaコードはA1、B1、C1などの新しいレコードを追加していますが、このレコードが追加される前に、以前の値をC1からC2に更新します。(更新後に) 新しいレコードを追加しようとしているときに、休止状態が一意の制約違反の例外をスローしています。なぜそうするのかについて何か理由はありますか?上記のすべてのステートメントは、同じトランザクション内で実行されます。私の仮定は、挿入が更新の前に発生するため、例外の理由です。

考えや提案はありますか?

4

2 に答える 2

4

更新後に session.flush() を使用してみてください。

于 2010-08-19T17:10:33.827 に答える
4

私のJavaコードはA1、B1、C1などの新しいレコードを追加していますが、このレコードが追加される前に、以前の値をC1からC2に更新します。(更新後に) 新しいレコードを追加しようとしているときに、休止状態が一意の制約違反の例外をスローしています。なぜそうするのかについて何か理由はありますか?上記のすべてのステートメントは、同じトランザクション内で実行されます。

これは、Hibernate が設計上どのように動作するかです。save()時間 (A1、B1、C1) に値を挿入し、次にそれらを更新します (C1 から C2)。A1、B1、C2 は挿入しません)。同じフラッシュでの挿入と更新でキングを引用する:

予想される Hibernate の動作 (これが本当に正しいかどうかは議論済みです!) は、save() が呼び出されたときに設定されたデータを INSERT ステートメントが正確に挿入することです。これにより、特にトリガーなどがあるコンテキストでは、ユーザーはよりきめ細かい制御を行うことができます。ただし、注意しないと、パフォーマンスが低下する可能性があります。

提案: 保存を遅らせて (A1、B1、C2) を直接挿入します。

于 2010-08-20T06:46:10.550 に答える