我有責任準備報價搜索屏幕。我提到了Oracle觀點 來創建報價模型。由於view表中沒有id列,我更喜歡使用通過quoteId.class使用@IdClass註釋的複合id。我在兩個模型上重寫hashCode和equals方法。 quoteId等於&散列碼返回所有字段的組合並且引用散列碼&等於只是比較模型中的this.quoteNo字段。當我使用@IdClass LinkedHashSet包括重複的項目
報價模式:
@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
嗨米克,謝謝你的回答,過了一會兒我已從Apache庫更改爲HashCodeBuilder和EqualsBuilder,但問題保持不變。今晚我會通過您的意見審查項目,並會更新我的問題。 – HRgiger 2012-03-13 09:27:40
和+1對於很好的解釋:) – HRgiger 2012-03-13 09:35:45
不客氣。你的當前版本的問題可能是:「新的EqualsBuilder()。appendSuper(super.equals(other)」。我猜你的quoteModel直接擴展了Object,並且像往常一樣,每個對象的實例都是不同的,你添加的其他東西甚至不會考慮到 – 2012-03-13 18:10:23