見積もり検索画面の作成を担当しました。見積もりモデルを作成するために Oracle ビューを参照しました。ビュー テーブルには id 列がないため、私は quoteId.class を介して @IdClass アノテーションを使用して複合 ID を使用することを好みます。両方のモデルで hashCode と equals メソッドをオーバーライドします。quoteId equals & hashcode はすべてのフィールドの組み合わせを返し、quote hashcode & equals は単にモデルの this.quoteNo フィールドを比較するだけです。
引用モデル:
@Override
public int hashCode()
{
return new HashCodeBuilder(17,37)
.append(quoteNo)
.toHashCode();
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj)
{
final quoteModel other = (quoteModel ) obj;
return new EqualsBuilder().appendSuper(super.equals(other))
.append(quoteNo, other.quoteNo).isEquals();
}
そして、ユニークなアイテムが必要なときは、次の方法でアクセスしていました:
uniqueQuoteResults = new ArrayList<Quote>(
new LinkedHashSet<Quote>(fullQuoteResults));
しかし、idClass の使用を開始すると、linkedHashSet にはすべてのアイテムが含まれており、引用番号も同じです。引用なしフィールド(比較可能、比較可能)を介して各アイテムの一意性を証明するための他の実装がありませんか?uniqueQuoteResult リスト項目の値をトレースすると、すべての項目の見積もり番号が同じになります。
編集注: Apache ライブラリの HashCodeBuilder と EqualsBuilder のサポートを使用する方法を変更しましたが、問題は変わりません。idClass ハッシュコードが linkedhashset に対して有効になっているのではないかと心配しています