Подтвердить что ты не робот

Как вы получаете equals(), работая с объектами Hibernate, когда lazy = true?

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

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

У меня была такая же проблема несколько дней назад. В проекте мы используем абстрактный базовый класс BasicEntityType, который имеет только идентификатор и 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());
}

В этом коде есть две критические части:

  • Во-первых: Не проверяйте непосредственно для равенства классов, оно может не работать с данным объектом.
  • Второе: все свойства данного объекта должны быть доступны с помощью методов. Или вы можете развернуть фактический объект.