2

私は2つのオブジェクトを持っています

  • 遅延読み込みによる 1 つ

      product:5757b95d1d8eecdd01e59b29$LazyLoadingProxy
    
  • もう一方の熱心なロード

      com.entity.Product@5e6c4568
    

同じ一意の ID ( ) を持っているため、両方のオブジェクトが同じであることがわかりますid=5757b95d1d8eecdd01e59b29

Productクラスに次のメソッドがあります。

  @Override
  public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = (prime * result) + ((id == null) ? 0 : id.hashCode());
    return result;
  }

  @Override
  public boolean equals(final Object obj) {
    if (this == obj) {
      return true;
    }
    if (obj == null) {
      return false;
    }
    if (getClass() != obj.getClass()) {
      return false;
    }
    final Item other = (Item) obj;
    if (id == null) {
      if (other.id != null) {
        return false;
      }
    } else if (!id.equals(other.id)) {
      return false;
    }
    return true;
  }

しかし、次の操作を行うと、一致しません。手がかりはありますか?

temp.contains(product) == false

temp遅延ロードされたアイテムをproduct含み、通常のアイテムを含みます。

4

1 に答える 1

1

要するに

それはあなたがどのように実装したかですequals

説明

Spring Data MongoDB は、コード生成ライブラリを使用して遅延読み込みプロキシを作成します。実行時に遅延ロードされた参照のクラスは、次のようになりますcom.example.Product$$EnhancerByCGLIB$$5f3cdccd。実装は、正確なクラス タイプのチェックを実行します

if (getClass() != obj.getClass()) {
  return false;
}

equalsを返す原因となりfalseます。チェックのよりわかりやすいバージョンは次のとおりです。

if (!(o instanceof Product)) {
    return false;
}

contains()また、どのインスタンスがコレクション内にあり、どのインスタンスが に渡されるかに応じて、プロキシ インスタンスまたはエンティティ クラスのいずれかでメソッドが呼び出されるequalsことにも注意してください。フィールドは常に入力されているため、これはチェックにhashCodeは関係ありませんが、他のプロパティを比較しようとすると関係があります。背後にある理由は、解決されたオブジェクトが個別に保持されるため、プロキシ フィールドが初期化されない (そして初期化されない) ことです。つまり、getter への require 呼び出し以外のプロパティを比較します。ididid

于 2016-06-09T09:32:07.703 に答える