hibernateによって管理されるJavaオブジェクトのオブジェクトの同等性をどのように処理しますか?「hibernateinaction」の本では、代理キーよりもビジネスキーを優先する必要があると述べています。
ほとんどの場合、私はビジネスキーを持っていません。人にマッピングされたアドレスについて考えてみてください。アドレスはセットに保持され、Wicket RefreshingViewに表示されます(ReuseIfEquals戦略を使用)。
サロゲートIDを使用するか、equals()およびhashCode()関数のすべてのフィールドを使用することができます。
問題は、これらのフィールドがオブジェクトの存続期間中に変更されることです。ユーザーがデータを入力したか、OSIV(Open Session in View)フィルター内でJPA merge()が呼び出されたためにIDが変更されたためです。
equals()およびhashCode()コントラクトについての私の理解は、これらはオブジェクトの存続期間中に変更されるべきではないということです。
私がこれまでに試したこと:
- equals()は、データベースID(または、idがnullの場合はsuper.hashCode())を使用するhashCode()に基づいています。問題:新しいアドレスはnull IDで始まりますが、人に接続されるとIDを取得し、この人はosiv-filterでmerge()(再接続)されます。
- hashCode()が最初に呼び出されたときにハッシュコードをレイジー計算し、そのハッシュコードを@Transitionalにします。merge()が新しいオブジェクトを返し、ハッシュコードがコピーされないため、機能しません。
私が必要とするのは、オブジェクトの作成中に割り当てられるIDだと思います。ここでの私の選択肢は何でしょうか?追加の永続プロパティを導入したくありません。オブジェクトにIDを割り当てるようにJPAに明示的に指示する方法はありますか?
よろしく