JPA: hashCode()/equals() のジレンマを回避する
JPA エンティティ実装の領域では、hashCode() と equals () メソッドは、データの整合性とオブジェクトの同一性を確保する上で重要な役割を果たします。ただし、実装の選択はアプリケーションに重大な影響を与える可能性があります。
オプションと影響
実装にはいくつかの可能性があり、それぞれに利点と欠点があります。
-
いいえオーバーライド:
- hashCode()/equals() コントラクトに準拠します
- 同一のオブジェクトを識別できません (異なるセッションからなど)
- 分離されたエンティティを処理します
-
主キーに基づくオーバーライド:
- hashCode()/equals() コントラクトを破ります
- 同一のエンティティを識別します(管理対象)
- 分離されたエンティティに関する問題
-
ビジネス ID に基づくオーバーライド:
- hashCode()/equals() を中断しますコントラクト
- 同一のエンティティ (管理対象) を識別します
- 分離されたエンティティには問題ありません
推奨事項
適切なオプションの選択は、特定のアプリケーションによって異なります要件:
-
不変性と List/Set 操作を保証するため: hashCode() とquals() をオーバーライドしないでください。
-
同一のオブジェクトを識別するため: プライマリに基づいて hashCode() とquals() をオーバーライドしますkey.
-
分離されたエンティティを処理する場合: ビジネス ID に基づいて hashCode() とquals() をオーバーライドするか、独自の ID 管理メカニズムの実装を検討してください。
その他の考慮事項
- Hibernate を使用している場合は、実装の具体的なニュアンスについては、記事「Don't Let Hibernate Steal Your Identity」を参照してください。
- hashCode() と equals() をオーバーライドすると、オブジェクト API で定義されたコントラクトが破られることに注意してください。
- hashCode() に複数の値を使用する場合、ハッシュベースのコレクションへの影響を考慮してください (取得の原因となる可能性があります)問題)。
以上がJPAエンティティ: hashCode()とequals()をオーバーライドするかオーバーライドしないか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。