2017-11-07 10 views
0

JPAという標準JEEアプリケーションがあります。以前に切り離されたエンティティをマージすると、エンティティマネージャはequalsまたはhashcodeを使用して、マージするオブジェクトがすでに管理されているかどうかを調べます。一般に、エンティティマネージャがhashcodeまたはequalsを使用する場合は、これは私が使用するJPAエンジンの影響を受けますか?たとえばHibernateまたはEclipse LinkJPAでエンティティマネージャがhashcodeとequalsを使用する方法

+0

EntityManagerはhashCode/equalsをまったく使用しません。これらはjava.util.Collectionクラスで使用されます。 – DN1

+0

エンティティがすでに管理されている場合、マージ中にエンティティマネージャがどのように検出されますか? –

+0

Collection.contains? EntityManagerは、 – DN1

答えて

0

これは実装に依存しますが、エンティティのハッシュコードまたは同等のメソッドを使用することは、JPAメカニズムにとって信頼できるものではありません。 EclipseLinkでは、equalsまたはhashcode実装を使用してルックアップや比較を実行しません。ハッシュコードが必要な場合は、System.identityHashCodeを使用します。

特に、コレクションタイプを使用するマッピングでは、正しくないまたは非効率なハッシュコードと等価メソッドがアプリケーションに悪影響を及ぼします。私はあなたがいくつかの大きな必要性なしでそれらを無効にしないことをお勧めしたい。

0

エンティティの状態を計算するには、HibernateはDirty checkingを使用します。汚れは、デフォルトのHibernateのチェックをすべての管理対象エンティティプロパティにより、

をチェックして

。エンティティがロードされるたびに、Hibernateはすべてのエンティティの追加コピーを作成し、プロパティ値を作成します。フラッシュ時には、すべての管理対象エンティティプロパティがロード時のスナップショット値と照合されます。

ダーティチェックは、ロード時にすべてプロパティ値をチェックすることによって実行されます。

equalshashcodeの関係はありません。entitymanagerは内部でHibernateで動作します。

関連する問題