如果你想要类似的东西
public class MyEntity {
private String name;
private Organization organization;
// getter's and setter's
public boolean equals(Object o) {
if(!(o instanceof MyEntity))
return false;
MyEntity other = (MyEntity) o;
return new EqualsBuilder().append(getName(), other.getName())
.append(getOrganization(), other.getOrganization())
.isEquals();
}
}
但是如果你想避免它,因为你现在确实想加载一个延迟加载的实体,你可以依赖Hibernate.isInitialized 方法并提供你的自定义例程
public boolean equals(Object o) {
if(!(o instanceof MyEntity))
return false;
MyEntity other = (MyEntity) o;
boolean equals = new EqualsBuilder().append(getName(), other.getName())
.isEquals();
if(Hibernate.isInitialized(getOrganization())) {
// loaded Organization
} else {
// supply custom routine
}
return equals;
}
我有一个未更新的网页,其中 Hibernate 提供以下矩阵
no eq/hC at all eq/hC with the id property eq/hC with buisness key
use in a composite-id No Yes Yes
multiple new instances in set Yes No Yes
equal to same object from other session No Yes Yes
collections intact after saving Yes No Yes
在哪里各种问题如下:
在复合 ID 中使用:
要将对象用作复合 ID,它必须以某种方式实现 equals/hashCode,在这种情况下 == 身份是不够的。
集合中有多个新实例:
以下是否有效:
HashSet someSet = new HashSet();
someSet.add(new PersistentClass());
someSet.add(new PersistentClass());
assert(someSet.size() == 2);
等于另一个会话中的相同对象:
以下是否有效:
PersistentClass p1 = sessionOne.load(PersistentClass.class, new Integer(1));
PersistentClass p2 = sessionTwo.load(PersistentClass.class, new Integer(1));
assert(p1.equals(p2));
收藏后保存完好:
以下是否有效:
HashSet set = new HashSet();
User u = new User();
set.add(u);
session.save(u);
assert(set.contains(u));
它还突出显示了这个 Thread,其中大量讨论了 equals/hashCode 实现