1

自動生成された主キーを持つエンティティで休止状態を使用してデータ入力の重複を防ぐ方法はありますか?

より具体的には、データベースに永続オブジェクトがあり、(まだデータベースに挿入されていない) 一時オブジェクトがあり、これら 2 つのオブジェクトは equals メソッドと hashcode メソッドに関して同じです。ただし、これらのオブジェクトのエンティティ クラスの ID には生成された値の注釈が付けられているため、hibernate は引き続き一時オブジェクトの新しいインスタンスをデータベースに作成します。その結果、データベースには異なる主キーを持つ重複したエントリ (equals および hashcode メソッドに関して) が含まれます。

はい、PK を自動生成しないようにすれば、UUID を使用すれば目標を達成できることはわかっています。しかし、自動生成された主キーを持つエンティティに対して equals メソッドと hashcode メソッドが機能しないのはなぜですか? それとも私は何か間違ったことをしていますか?

4

3 に答える 3

4

equals メソッドと hashcode メソッドが機能しない理由

効率的な方法がないため、Hibernate はequals()/ here を尊重しません。hashCode()

equals()Hibernate は、( に関して) 同じ ID を持つオブジェクトがデータベースに既に存在することをどのように確認できますか? 任意の条件を含めることができるためequals()、Hibernate はそれを SQL クエリに変換できないため、それをチェックする唯一の方法は、すべてのオブジェクトをメモリにロードしequals()、それらを呼び出して保存しようとしているオブジェクトと比較することです。

したがって、Hibernate は主キーを使用してオブジェクトの ID を定義します。

それとも私は何か間違ったことをしていますか?

あなたが何を達成しようとしているのかは明らかではありません。渡したオブジェクトの状態でデータベース内のオブジェクトを Hibernate に更新させたい場合は、 を使用する必要がありますmerge()

以下も参照してください。

于 2011-03-24T14:27:58.590 に答える
2

データベース レベルの主キーは、アプリケーション レベルでの等価性のテストに使用するのと同じフィールドを使用する必要があります。代理キーが本当に必要な場合 (おそらくパフォーマンス上の理由で?)、これらのフィールドに「一意のインデックス」を適用し、hibernate がスローして例外を発生させるようにします。

于 2011-03-24T14:36:46.957 に答える
0

DB レベルで制約を適用します。これがないと、特にアプリがクラスター化されている場合、重複を避けるのは困難 (不可能?) です。

于 2011-03-24T14:19:46.677 に答える