在您的模型中使用以下代码,您测试的是 this.quoteNo 与 obj.quoteNo 相同的实例:
@Override
public boolean equals(Object obj)
{
// TODO Auto-generated method stub
return this.quoteNo == ((EprocAwquoteV) obj).quoteNo;
}
结果是,如果 quoteNo 不是同一个对象,则具有单独构造的 IdClass 实例的两个实例将被认为不相等。我猜你想用类似的东西来测试quoteNo的相等性:
this.quoteNo.equals(other.quoteNo);
模型中equals的当前实现还有一些其他问题(例如它可以抛出ClassCastException)。基本原理可以参考:Object.equals和Overriding the java equals() method quirk。此外,对于 Hibernate,重要的是要记住,您不应该测试类相同,而是使用 instanceof 代替(因为代理类)。可以从Hibernate 文档中找到有关为实体编写 equals&hascode 的一些说明。
编辑:
您当前的方法不起作用,因为
return new EqualsBuilder().appendSuper(super.equals(other))
归结为 Object.equals。如果您没有具有有意义的 equals 实现的超类。我不完全确定我是否理解你的情况,所以也许你可以看看下面的工作示例,找出不同之处:
public class QuoteId implements Serializable {
private int id1;
private int id2;
public QuoteId() {}
//This equals does not matter when we build LinkedHashSet
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
QuoteId other = (QuoteId) o;
return id1 == other.id1 && id2 == other.id2;
}
public int hashCode() {
return 31 * id1 + id2;
}
}
@Entity
@IdClass(QuoteId.class)
public class Quote {
@Id private int id1;
@Id private int id2;
String value;
public Quote() {
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Quote other = (Quote) o;
return id1 == other.id1 && id2 == other.id2;
}
@Override
public int hashCode() { return 31 * id1 + id2;}
//get&set for id1, id2, and value are omitted
}
tx.begin();
em.persist(new Quote(1, 1, "val"));
em.persist(new Quote(1, 2, "val"));
tx.commit();
TypedQuery<Quote> query = em.createQuery("SELECT q FROM Quote q", Quote.class);
List<Quote> twoQuotes = query.getResultList();//both
//duplicating (size=4) result for sake of test;
List<Quote> fullQuoteResults = new ArrayList<Quote>();
fullQuoteResults.addAll(twoQuotes);
fullQuoteResults.addAll(twoQuotes);
//will have same elements as in twoQuotes:
List<Quote> uniqueQuoteResults = new ArrayList<Quote>(
new LinkedHashSet<Quote>(fullQuoteResults));