Java#equals
で UDT の実装を提供するときの条件の 1 つは、渡された引数オブジェクトが現在のクラスのインスタンスである必要があるreturn false
ことです。ただし、Hibernate 4 を使用している間、この条件が失敗する遅延読み込みが原因で、javassist プロキシ インスタンスが発生する可能性があります。これを克服するための最良の選択は何でしょうか? 私が考えることができるいくつかの選択肢は次のとおりです。#equals
equals
プロキシのケースを考慮して実装を拡張します。短所: 保守性の犠牲、Hibernate プロキシ インフラストラクチャへのハードワイヤードな依存関係、ハッキー、エンティティまたはドメイン モデルは、使用されている ORM に依存しない必要があります。つまり、ORM が必要ないさまざまなコンテキスト (Swing UI など) で再利用される可能性があるためです。- を呼び出す前に、プロキシかどうかを確認してください
equals
。短所: 常に可能であるとは限りません。つまり、コレクションやequals
、Map などの暗黙的な呼び出しを処理します。 - 遅延読み込みの使用は控えてください。短所:すべてのユースケースで合理的でも効率的でもありません。
アップデート
EJ2 をもう一度確認すると、次のシナリオはすべてのシナリオ (Type-Type、Type-Proxy、Proxy-Type、および Proxy-Proxy) で機能すると思いますが、以下のコメントの 1 つで指摘されているように、Type を比較すると永久にループする可能性があります。まったく異なるタイプです。たとえばPerson.equals(Employee)
、どちらも同じ EJ2 基準に等しいです。
if (this.getClass() != anObject.getClass())
{
return anObject.equals(this);
}