使用equals / hashCode比较延迟加载的Spring Data MongoDB实体

时间:2016-06-08 06:28:44

标签: java spring-data spring-data-mongodb spring-mongo spring-mongodb

我有两个对象

  • 懒惰加载

      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包含普通项目。

1 个答案:

答案 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()的实例,在代理实例或实体类上调用equalshashCode方法。这与id检查无关,因为始终会填充id字段,但如果您尝试比较其他属性,则会相关。 背后的原因是代理字段未初始化(并且不会被初始化),因为已解析的对象是独立的。这意味着比较id以外的属性需要调用其getter。