3

インデックスには、同一の列を持つ複数のレコードを許可しないUNIQUEデータベース制約があります。

Hibernate(v2.1.8)によって管理され、2つのDAO
getHibernateTemplate().save( theObject )
呼び出しを実行するコードがあり、その結果、上記のテーブルに2つのレコードが入力されます。

このコードがトランザクションなしで実行されると、INSERT、UPDATE、次に別のINSERT、および別のUPDATE SQLステートメントが生成され、正常に機能します。どうやら、シーケンスは最初にDB NULLを含むレコードを挿入し、次に適切なデータでそれを更新することです。

このコードが単一のSpringトランザクションにラップされたSpring(v2.0.5)で実行されると、2つのINSERTが発生し、上記のUNIQUE制約のために即時例外が発生します。

この問題は、ANSI SQLとの互換性がないため、MSSQLでのみ発生します。MySQLとOracleで正常に動作します。残念ながら、私たちのソリューションはクロスプラットフォームであり、すべてのデータベースをサポートする必要があります。

このテクノロジーのスタックがある場合、特定の問題に対する好ましい回避策は何ですか?

4

2 に答える 2

1

2 つの保存の間に休止状態セッションをフラッシュしてみてください。これにより、Hibernate が 2 回目の挿入の前に最初の更新を実行するように強制される場合があります。

また、休止状態が挿入で NULL を挿入していると言うとき、すべての列が NULL であることを意味しますか、それとも ID 列だけですか?

于 2008-09-28T12:22:53.983 に答える
0

私はHibernateの経験がないので、DBを自由に変更できるかどうか、またはHibernateが特定のDB構造を必要とするかどうかはわかりません。

変更を加えることができる場合は、MSSQLでこの回避策を使用してANSIの動作をエミュレートできます。

一意のインデックス/制約を削除します

次のように計算フィールドを定義します。

alter table MyTable Add MyCalcField as 
case when MyUniqueField is NULL 
      then cast(Myprimarykey as MyUniqueFieldType) 
      else MyUniqueField end

作成したこの新しいフィールドに一意の制約を追加します。

当然、これはMyUniqueFieldが主キーでない場合に適用されます。:)

詳細については、databasejournal.comのこの記事をご覧ください。

于 2008-09-26T07:53:15.187 に答える