2016-11-03 5 views
1

興味のあるフィールド/属性を選択することによって、JPAエンティティのhashcode()およびequals()メソッドを生成するためにEclipseを使用しました。JPAエンティティのequals()メソッドの正しい実装方法

しかし、私が観察しているEclipseが生成さequalsメソッド内の行の下に追加しているようだということ:

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

上記のチェックを持っている論理的なようだが、私はすべての私のJPAエンティティでLAZYロードされた関係を使用しています、ある特定の例では、objのクラスが何らかの種類のプロキシされたクラスであり、主なオブジェクトが問題のエンティティである場合にチェックが失敗することがわかりました。 - 私は比較対象のクラスを検査しています。オブジェクトがデータベースから同じレコードを表したとしても、上記の条件はfalseと評価されます。

私は、JPAエンティティのためにequals()メソッドを実装する際に、オブジェクトのクラスを比較する必要があります。

+0

通常、このチェックは、ClassCastExceptionを防止するためのものです。プロキシクラスとメインエンティティクラスの両方にキャストする共通の親がありますか? – 4castle

+0

私は 'Student'クラスのインスタンスを' Student'クラスのインスタンスのコレクションと比較しようとします。最初のインスタンスはDBから読み込まれますが、コレクションは他のエンティティへの子関係の一部であるため、遅く初期化されます。例えば、 'College' –

+0

それは本当に私の質問に答えるものではありません。あなたのコードは 'if'ステートメントなしで実行できますか?もしそうなら、あなたはもっと寛大で、 'getClass()'を比較する代わりに 'instanceof'チェックを使用することができます。 – 4castle

答えて

2

JPAエンティティのビジネスキー平等を使用することをお勧めします。 自動生成されたequalsはすべてのフィールドを使用します。

ほとんどの場合、エンティティには技術的な自動生成された主キー(idフィールド)があります。このフィールドは、エンティティが永続化された後、データベースによって設定されます。 equals/hashcodeを自動生成した場合は、そのidフィールドを含むすべてのクラスフィールドが含まれます。 したがって、エンティティのequals/hashcodeは、他のフィールドを変更することなく永続化した後で変更されます(永続IDがnullになる前にnullになります)。詳細については

が、これはHibernateのリファレンスです https://docs.jboss.org/hibernate/stable/core.old/reference/en/html/persistent-classes-equalshashcode.html

読みますが、主キーに関連するすべての概念は、任意のJPAプロバイダに適用されるべきです。

+0

@Bartosz Bilickiと全く同意します.JAAエンティティはデータベース行のJavaビューのみです。 SQLドキュメントによると、 'PRIMARY KEY制約はデータベーステーブルの各レコードを一意に識別する'。したがって、同じIDを持つ2つのエンティティがある場合、同じエンティティであることを意味します。 – degr

+0

Eclipseで、クラス - のすべてのフィールド/属性を使用していないので、オプション 'Source-> Generated equals and hashcode'を使用すると、自然な等価性を確立するフィールドを選択するためのGUIが提供されます。 –

関連する問題