0

「タイトル」プロパティを持つ一連の記事オブジェクトがあるとします。次に、TITLE 列を持つ ARTICLE テーブルがあります。TITLE 列には一意制約があります。

UI では、1 ページにすべての記事が表示され、タイトルを編集するためのテキスト フィールドが表示されます。

2 つの記事 X と Y があり、X のタイトルが「1」で、Y のタイトルが「2」である状況を想像してください。このページで、Y の名前を「2」に、X の名前を「1」に変更してから、フォームを送信します。フォームから値を hibernate オブジェクトに直接コピーして保存すると、 ConstraintViolationException が発生します。

コレクションから「1」の記事を削除し、「1」というタイトルの別の記事を追加してコレクションを保存した場合にも発生します。

では、この Hibernate の癖に対処する最善の方法は何でしょうか? UIか何かを再配置する必要があるような気がします。休止状態のオブジェクトを保存する前にこれらの条件を手動でチェックするのは少し面倒です。

4

2 に答える 2

0

以前の回答にも関わらず、2つの永続エンティティの一意のフィールドを並べ替えると、1回のパスで行っても制約違反エラーが発生することを確認しました。

したがって、この問題を解決する最も簡単な方法は、最終結果が有効であっても、フィールドが一意性制約に違反していることを意味する変更を許可しないことです。これは、UIレイヤーでコーディングするのはかなり簡単なはずです。

なぜ?

私がここで見つけたように、少なくともMySQLはこの制限の対象であるように思われ、深刻なパフォーマンスのペナルティなしにこれを修正する簡単な方法はないようです。

したがって、この問題はプログラムで簡単に解決できると思います。はい、それはひどいことですが、更新が2つの既存の一意のフィールドを並べ替えるかどうかを確認するための簡単なコードを記述し、2つのステップで実行できるはずです。

ただし、毛むくじゃらになることがあります。2つではなく3つのインスタンスを並べ替えることを想像してみてください。たとえば、「A」、「B」、「C」は「B」、「C」、「A」になります。3つのステップ?次は何?

于 2009-08-25T19:57:29.467 に答える
0

私の推測では、一度に各インスタンスを更新しようとしているために、実際には固有のプロパティが衝突しています。

Session各クエリ間でオブジェクトが閉じられているかフラッシュされているかを確認します。この場合、閉じる/フラッシュする前に両方のインスタンスを変更する必要があります。

編集:私が投稿した次の回答を必ず読んでください。

于 2009-08-25T19:13:21.100 に答える