10

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);
    }
4

4 に答える 4

8

Willem de Witの回答にコメントするという評判はありません。新しい回答を投稿する必要があるよりも。

djechelon の問題を解決するには、次の行を置き換える必要があります。

if (!getClass().isAssignableFrom(obj.getClass()))

為に

if ( !obj.getClass().isAssignableFrom(getClass()) && !getClass().isAssignableFrom(obj.getClass()) )

次に、すべてのシナリオ (Type-Type、Type-Proxy、Proxy-Type、および Proxy-Proxy) で等しいことを確認します。

私もあなたの答えに投票するという評判はありません。私はとても惨めです!

于 2014-03-11T12:45:25.867 に答える
1

できることは 2 つあります。 1. equals を変更して、class equality の代わりに instanceof を使用します。プロキシのタイプはエンティティのタイプと同じではなく、エンティティのタイプを拡張します。

  1. エンティティ自体を取得するためにプロキシをアンラップします (これを行うのに役立つ休止状態のツールがいくつかあります)
于 2013-03-24T12:10:42.087 に答える