2012-04-19 6 views
0

Hibernate上の同じエンティティの遅延読み込みオブジェクトを比較する最適な方法は何ですか?Hibernateで同じエンティティの遅延読み込みオブジェクトを比較するには?

//instanceC and instanceD are different objects of different classes 

instanceC.getA().equals(instanceD.getA()) // false 

instanceC.getA().getId() == insttanceD.getA().getId() // false! 

それでは、私は最後に行うことは次のとおりです。

int idA=instanceC.getA().getId(); 
int idB=instanceD.getA().getId(); 

a==b // true 

そして、それは当然のひどく曲がって見えます。だから私は最後にequals()メソッドをオーバーライドしてこの混乱を隠すことに決めました。

優れた(または適切な)ソリューションがありますか?

注:スタックオーバーフローに関する質問Lazy-loaded NHibernate properties in Equals and GetHashCodeなどを確認しました。私は回避策を求めていません。私は、存在する場合には、より良い解決策または正確な解決策を提示するために、この質問をしたい。

+1

通常の文字列比較を使用してください:なぜなら、 'instanceA.getId()。equals(instanceB.getId()) '? – DRCB

+0

カスタムオーバーロードされた等価関数を作成する必要があります。あなたが提供したリファレンスによく似ています。 –

+0

@ DRCB複合キーが使用される場合、文字列比較は機能しません。 –

答えて

0

エンティティを比較するには、常に識別プロパティ(ほとんどの場合、Idという名前のフィールド)を比較します。これは、最初にエンティティになる理由の大きな部分です。

IDはもちろん遅延ロードされないので、問題はありません。エンティティの等価とハッシュコードは、IDとIDのみを考慮して実装する必要があります。私は休止状態がこれを正しく実行することを期待していると思います。これを行う方法を(あなたは私に言わせれば、最高の、)

通常

です:idを比較

equals(Object other){ 
     if (this == o) return true; 
     if (o==null) return false; 
     if (!Entity.class.isAssignableFrom(other.getClass()) return false; 
     Entity otherEntity = (Entity) other; 

     if (otherEntity.getId() == getId()) return true; 
     if (otherEntity.getId() == null) return false; 
     return otherEntity.getId().equals(getId()); 
} 

hashCode(){ 
    if (getId()) == null return super.hashCode(); 
    return getId().hashCode(); 
} 
+0

。 IDの比較は私に偽を与えている。はい、たとえIdがレイジーローディングエンティティにロードされていなくても。 – kommradHomer

+0

その場合、IDの比較が失敗する理由をデバッグします。 idsが正しく処理されていることを確認していますか?一般的な規則として、あなたのidsを怠惰にロードしないでください(私は冬眠がこれをすることはできません)。 –

+0

誤解があるかもしれません。質問のコードをもう一度チェックすることはできますか? – kommradHomer

1

が正しい方法である(ただし、IDのデータベース内で一意のインデックスがある場合にのみカラム)。ユニークなインデックスは、それが同じエンティティであることを保証します。 (ただし、2つのインスタンスを比較して、保存するなどの変更があるかどうかを確認する場合は、すべてのメンバー変数を比較する必要があります)

instanceA.getId()は何を返しますか?

int場合、

instanceC.instanceA.getId()==insttanceD.instanceB.getId() 

はうまく動作するはずです。

その後、Integer場合、あなたはそれがあなたの問題だったことかもしれません

instanceC.instanceA.getId().equals(insttanceD.instanceB.getId()) 

を使用する必要があります。そうでない場合は、IDの比較がうまくいかない理由はわかりません。私はいつもidを比較しています - 怠惰な読み込みでも - それはうまくいきます。

+0

私は問題がありません。オブジェクトの遅延ロードされたオブジェクトを比較するために、一般的な解決法、または正しい方法を求めています。 – kommradHomer

+0

これは一般的な解決策です。識別子を比較するだけです。 e。主キーインスタンスに遅延ロードまたは通常ロードがロードされている場合(少なくともセッションがクローズされていない限り)は、違いはありません。 – Johanna

+0

は機能しません。比較するとfalseを返す – kommradHomer

関連する問題