当lazy = true时,如何让equals()使用Hibernate实体?

ege*_*ari 13 proxy hibernate lazy-loading equals

出于某种原因,当我的所有实体上的lazy = true时,当一方是延迟加载的实体而另一方是普通实体时,equals()方法无法正常工作.这是一个例子:

if(activeTask.getTask().equals(task)) {...}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,activeTask的任务将是代理,而右侧将是常规任务.equals()将失败.要解决这个问题,我经常做这样的事情:

if(activeTask.getTask().getId() == task.getId()) {...}
Run Code Online (Sandbox Code Playgroud)

这有效,但它并不理想.我宁愿使用我的equals()方法.

有没有人有一个很好的解决这个问题的方法?它真的增加了应用程序的噪音水平,不得不考虑这样的东西.

如果我说lazy = false,我不必处理代理,所以equals()将起作用.但这对性能产生了非常不利的影响.

不得不说,"equals()在所有情况下都有效,除非你使用代理......然后equals()不可靠."

小智 8

我意识到这是一个古老的问题,但它仍然没有答案,人们可​​能偶然发现它.

几天前我遇到了同样的问题.在项目中,我们使用一个抽象基类BasicEntityType,它只有一个ID,并且在所述基类中实现了equals:

@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());
}
Run Code Online (Sandbox Code Playgroud)

此代码中有两个关键部分:

  • 第一:不要直接检查类的相等性,它可能不适用于给定的对象.
  • 第二:必须使用方法访问给定对象的所有属性.或者你可以解开实际的对象.