我有一个抽象ID和版本属性的BaseEntity。此类还实现哈希码,并基于PK(id)属性进行等于。
BaseEntity{ Long id; Long version; public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((id == null) ? 0 : id.hashCode()); return result; } public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; BaseEntity other = (BaseEntity) obj; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; return true; } }
现在两个实体A和B扩展了BaseEntity,如下所示
A extends BaseEntity{ `B b` B getB(){return b;) void setB(B b){this.b=b;} } B extends BaseEntity{ } object b1; object a1; a1.set(b1); session.save(a1) //cascade save;
关闭会话以懒惰的b加载a并尝试a1.getB()。equals(b1)给出false,但如果我与a1.getB()。getId()。equals(b1.getId())比较,则得出真正的奇怪!我认为是因为Java辅助代理对象,无论如何要解决此问题?
为了能够延迟加载a.b关联,Hibernate将b字段设置a为代理。代理是扩展B的类的实例,但不是B。因此,将非代理B实例与代理B实例进行比较时,您的equals()方法将始终失败,因为它会比较两个对象的类:
a.b
b
a
if (getClass() != obj.getClass()) return false;
对于Hibernate实体,应将其替换为
if (!(obj instanceof B)) { return false; }
另外请注意
equals()
hashCode()