0

スタック: Tomcat 7、Spring 3.1.1、OpenJPA 2.2.0

私は問題に遭遇しました、ルートは比較でした:

server1.equals(server2);

server1 と server2 はどちらもエンティティ「サーバー」のインスタンスです。

@Entity
public class Server implements Serializable {
   private long id;
   // getters and setters
}

比較を次のように変更する必要がありました。

server1.getId().equals(server2.getId());

サーバーのIDが同じであっても、上記のものはfalseを返します。2 つのインスタンスの hashCode も確認しましたが、実際には 2 つのインスタンスの hashCode が異なっていました。

アプリケーションに同じエンティティの 2 つのインスタンスがあるのはなぜですか?

どうすればそれが起こりますか?データベースには「サーバー」のエンティティが 1 つしかありません。

ありがとう!
セバスチャン

4

3 に答える 3

4

たとえば、異なるエンティティ マネージャーまたは異なるトランザクションでそれらをロードすると、異なるインスタンスが存在します。

于 2012-11-26T06:26:09.803 に答える
0

別のセッションまたはセッション外の場合、Entiry の複数のインスタンスが存在します。あなたの場合ClientListHashMapStore、トランザクションの一部ではない比較を行っています。つまり、セッションがなく、Entity の複数のインスタンスが存在することになります。equals2 つのインスタンスの比較が必要な場合は、メソッドをオーバーライドするのが理想的です。

于 2012-12-20T02:51:25.467 に答える
0

最初に思い浮かぶのは、アプリケーションに (少なくとも) 2 つのクラス ローダーがあることです。1 つはエンティティをロードし、次にインスタンス server1 が作成され、2 番目は server2 をロードします。通常、これらはテクノロジー スタックによって内部的に管理されます。

これは、特定のアプリケーションだけでなく、Java では一般的に正しいです。ここで注意が必要なのは、これらのクラス ローダーがどこから来たのかということです。

まず第一に、これが事実であることを確認するために、次のようなクラスローダーを印刷してみることができます:

print before comparison: server1.getClass().getClassLoader()
print before comparison: server2.getClass().getClassLoader()

これにより、そこで何が起こるかを知ることができます。たとえば、さまざまな展開ユニットから取得される場合があります。

お役に立てれば

于 2012-11-26T06:26:53.770 に答える