hibernate - 当lazy=true 时,如何让equals() 与Hibernate 实体一起工作?

标签 hibernate proxy lazy-loading equals

出于某种原因,当我的所有实体上的 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/

    相关文章:

    mysql - 如何使用 spring.jpa.hibernate.ddl-auto

    go - 在 Golang 中绕过 http_proxy

    c++ - 将延迟加载编写为模板类是否合理?

    asp.net-mvc-3 - ASP.Net MVC 3,复杂对象和延迟加载

    java - 如何在 HQL 中使用 NOT LIKE?

    java - 访问数据库时分离关注点的最佳实践

    spring - JpaRepository 不会保存数据

    asp.net-core - 如何为任何请求的 HTTP 客户端设置 .NET Core 3.1 的默认代理?

    sockets - UDP 代理,如何维护/重用/清除连接的客户端池?

    python - 如何从 django/sqlalchemy 处理的数据库中批量获取模型对象