JavaでUDTの実装を#equals
にすると、渡された引数オブジェクトは現在のクラスのインスタンスでなければなりません。そうでない場合は失敗します。return false
Effective Java(EJ2) 。しかし、Hibernate 4を使用している間に、この#equals
の条件が失敗する遅延ロードのために、javassistプロキシインスタンスで終わる可能性があります。これを克服するための最良の選択は何でしょうか?私が考えることのできるいくつかの選択肢は:Hibernate javassistのプロキシと `Object#equals`
- の実装を拡張して、プロキシのケースを考慮に入れてください。短所:Hibernateプロキシインフラストラクチャ、ハッキー、エンティティまたはドメインモデルへの保守性の高い料金、ハードワイヤード依存性は、使用されているORMには、ORMを必要としない異なるコンテキストで再利用される可能性があるため、スイングUI。
equals
を呼び出す前にプロキシであるかどうかを確認してください。短所:常に可能なわけではない、すなわち、コレクションおよび暗黙的な呼び出しの処理equals
、たとえば、マップ。- 遅延読み込みを使用しないようにします。短所:すべてのユースケースで合理的でも効率的でもない。コメントの一つに指摘したよう
UPDATE
再び、私は次のようにすべてのシナリオ(タイプ型、型プロキシ、プロキシ型およびプロキシプロキシ)のために働くだろうと信じていEJ2の確認が、タイプが完全に異なるタイプと比較される場合、それは永遠にループします。 Person.equals(Employee)
であり、どちらもEJ2基準に等しい。 1.イコールで使用するように変更instanceofは代わりのクラスの平等:
if (this.getClass() != anObject.getClass())
{
return anObject.equals(this);
}
プロキシはエンティティのクラスを拡張しますか? –
プロキシインスタンスは拡張されません。 'InvocationHandler'と'(this.getClass()== anObject.getClass()) 'の条件は勿論falseに評価されます。 –
オプションを廃止しました。有効なJavaアドバイスを無視し、.equals()内のサブクラスを許可しました。 –