Как вы получаете equals () при работе с сущностями Hibernate, когда lazy = true? - PullRequest
13 голосов
/ 30 ноября 2010

По какой-то причине, когда lazy = true для всех моих сущностей, метод equals () не работает правильно, когда одна сторона является лениво загруженной сущностью, а другая сторона - нормальной сущностью.Вот пример:

if(activeTask.getTask().equals(task)) {...}

В этом случае задача ActiveTask будет прокси, а правая сторона будет обычной.Равно () не удастся.Чтобы решить эту проблему, я часто делаю такие вещи:

if(activeTask.getTask().getId() == task.getId()) {...}

Это работает, но не идеально.Я предпочел бы использовать метод equals ().

У кого-нибудь есть хорошее решение этой проблемы?Это действительно добавляет к уровню шума приложения необходимость думать о таких вещах.

Если я скажу lazy = false, мне не придется иметь дело с прокси, и поэтому equals () будет работать.Но это очень негативно влияет на производительность.

Просто нехорошо говорить, что "equals () работает во всех случаях, кроме случаев, когда вы используете прокси ... тогда equals () не надежен. "

Ответы [ 2 ]

8 голосов
/ 20 ноября 2012

Я понимаю, что это старый вопрос, но он все еще остается без ответа, и люди могут наткнуться на него.

У меня была такая же проблема несколько дней назад. В проекте мы используем абстрактный базовый класс BasicEntityType, который имеет только идентификатор и равен, реализован в указанном базовом классе:

@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());
}

В этом коде есть две важные части:

  • Первое: не проверять непосредственно на равенство классов, оно может не работать с данным объектом.
  • Второе: все свойства данного объекта должны быть доступны с помощью методов. Или вы можете развернуть реальный объект.
2 голосов
/ 15 февраля 2011

Я ввел похожий вопрос для nhibernate.Возможно, ответы, приведенные здесь, также будут полезны для этого вопроса: свойства nhibernate с отложенной загрузкой в ​​equals и gethashcode

...