出于某种原因,当我的所有实体上的 lazy=true 时,当一侧是延迟加载的实体而另一侧是普通实体时,equals() 方法无法正常工作。下面是一个例子:
if(activeTask.getTask().equals(task)) {...}
在这种情况下,activeTask 的任务将是一个代理,而右侧将是一个常规任务。 equals() 将失败。为了解决这个问题,我经常做这样的事情:
if(activeTask.getTask().getId() == task.getId()) {...}
这有效,但并不理想。我宁愿使用我的 equals() 方法。
有没有人对这个问题有一个很好的解决方案?不得不考虑这样的事情确实增加了应用程序的噪音水平。
如果我说lazy=false,我就不必处理代理,所以equals() 会起作用。但这对性能有非常负面的影响。
不得不说,“equals() 在所有情况下都有效,除非你使用代理……那么 equals() 是不可靠的”,这并不酷。
最佳答案
我意识到这是一个古老的问题,但它仍然没有答案,人们可能会偶然发现它。
几天前我遇到了同样的问题。在项目中我们使用了一个抽象基类 BasicEntityType
,它只有一个 ID 并且等于在所述基类中实现:
@Override
public final boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
Class<?> objClass = HibernateProxyHelper.getClassWithoutInitializingProxy(obj);
if (this.getClass() != objClass) {
return false;
}
if (id == null) {
return false;
}
return id.equals(((BasicEntityType) obj).getId());
}
这段代码中有两个关键部分:
关于hibernate - 当lazy=true 时,如何让equals() 与Hibernate 实体一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4309311/