2011-06-30 9 views
4

JPAを使用して、特に永続化されていない新しく作成されたエンティティについて、equals()およびhashcode()という問題が発生しました。EclipseLinkを使用したJPAエンティティのequals()およびhashcode()

私はstackoverflowの中に次のような答えが見つかりました:この回答のHibernateセッションに関する協議を

Should I write equals() methods in JPA entities?

を。私はHibernate(しかし、EclipseLink)を使用せず、これらの "セッション"のようなJPAプロバイダの実装の詳細についてはわかりません。

私の質問は、JPAに関してHibernateセッションとは何ですか?または、より具体的には、equals()hashcode()を上書きしないと、同じエンティティを表す2つのオブジェクト(存在する場合は同じビジネスキー)が「等しい」という問題に遭遇します(これはequals()を意味します)。偽)?

は、これらの問題になっていないと十分で同じEntityManagerインスタンスを使用します

注意を(「セッション」と「EntityManagerのは」この文脈での等価を使用することができ、これは意味を、?):私は、使用可能なを持っていませんすべてのテーブルのビジネスキーのため、equals()およびhashcode()のビジネスキー属性を使用するソリューションは適用できません。

答えて

1

デフォルトのequalsメソッドは物理アドレスを比較するので、同じエンティティの2つのデタッチされたインスタンス、または接続されたインスタンスとデタッチされたインスタンスを持つことができます。

ビジネスキーのないエンティティに対して良好なequalsメソッドを実装することはほとんど不可能です。ビジネスキーを持つエンティティであっても、このビジネスキーが変更可能な場合、私たちは破滅します。

6

EclipseLinkにはequals()およびhashCode()(Idクラスの場合でも)に対する特別な要件はありません。

永続コンテキスト内では、アイデンティティが維持されるため、デフォルトのequalsおよびhashCodeが機能します。

デタッチされたオブジェクトのIDは異なるため、IDまたはその他の基準を使用するようにオーバーライドしない限り、equalsはtrueを返しません。これによりEclipseLinkに問題は発生しませんが、アプリケーションに依存することがあります。

通常、equalsおよびhashCodeは、オブジェクトがセットまたはマップで使用されている場合は正しく実装する必要がありますが、EclipseLinkは常に内部的にアイデンティティ・マップおよびセットを使用するため、内部的に問題はありません。

+0

これは権威ある答えです:[Jamesのプロフィールを参照](http://stackoverflow.com/users/416206/james)! – Arjan

+0

@James:EclipseLinkが常にIDセットを使用することは(まだ)真実ですか?特に悪いhashCode実装があり、削除時に大きなパフォーマンス上の問題が発生しています。 UnitOfWorkImplのコードを見ると、バニラのHashMap/HashSetsを使って削除依存関係をすべて追跡していることがわかります。それはバグですか、それとも設計ですか?いずれにしても、EclipseLinkはこれらのメソッドから何も必要としないという考え方と矛盾しているようです。 –

関連する問題