0

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()てこの混乱を隠すことです。

より良い(または正しい)解決策はありますか?

注: Stack Overflow question Lazy-loaded NHibernate properties in Equals と GetHashCodeなどを確認しました。回避策を求めているわけではありません。より良い解決策または正確な解決策が存在する場合は、この質問を提示したいと思います。

4

2 に答える 2

1

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

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

もしそうintなら

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

うまくいくはずです。

その場合Integer、使用する必要があります

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

それがあなたの問題だったのかもしれません。そうでない場合、ID の比較が機能しない理由がわかりません。私は常にIDを比較します-遅延読み込みを使用しても-うまく機能します。

于 2012-04-19T09:42:33.583 に答える
0

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

もちろん、id は決して遅延ロードされないため、問題にはなりません。エンティティの equals とハッシュコードは、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();
}
于 2012-04-19T09:07:23.473 に答える