我有两个对象
懒惰加载
product:5757b95d1d8eecdd01e59b29$LazyLoadingProxy
另一个急切的
com.entity.Product@5e6c4568
我知道两个对象都是相同的,因为它们具有相同的唯一ID(id=5757b95d1d8eecdd01e59b29
)。
我的Product
课程中有以下方法:
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = (prime * result) + ((id == null) ? 0 : id.hashCode());
return result;
}
@Override
public boolean equals(final Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Item other = (Item) obj;
if (id == null) {
if (other.id != null) {
return false;
}
} else if (!id.equals(other.id)) {
return false;
}
return true;
}
但是现在当我做以下操作时,我得不到匹配。有线索吗?
temp.contains(product) == false
temp
包含延迟加载的项目,product
包含普通项目。
答案 0 :(得分:1)
这就是您实施equals
的方式。
Spring Data MongoDB使用代码生成库创建延迟加载代理。运行时延迟加载引用的类类似于com.example.Product$$EnhancerByCGLIB$$5f3cdccd
。您的实现会检查确切的类类型
if (getClass() != obj.getClass()) {
return false;
}
导致equals
返回false
。一个更友好的支票版本是:
if (!(o instanceof Product)) {
return false;
}
另请注意,根据集合中的哪个实例以及传递给contains()
的实例,在代理实例或实体类上调用equals
和hashCode
方法。这与id
检查无关,因为始终会填充id
字段,但如果您尝试比较其他属性,则会相关。
背后的原因是代理字段未初始化(并且不会被初始化),因为已解析的对象是独立的。这意味着比较id
以外的属性需要调用其getter。