Как вы получаете 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() не является надежным".
Ответы
Ответ 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());
}
В этом коде есть две критические части:
- Во-первых: Не проверяйте непосредственно для равенства классов, оно может не работать с данным объектом.
- Второе: все свойства данного объекта должны быть доступны с помощью методов. Или вы можете развернуть фактический объект.
Ответ 2
Я ввел аналогичный вопрос для nhibernate. Возможно, ответы, приведенные здесь, также будут полезны для этого вопроса: lazy-загруженные свойства nhibernate в equals и gethashcode