При предоставлении реализации #equals
для UDT в Java одно из условий заключается в том, что переданный объект-аргумент должен быть экземпляром текущего класса, иначе мы с ошибкой return false
см. Эффективная Java (EJ2). Тем не менее, при использовании Hibernate 4 мы можем получить экземпляры javassist proxy из-за ленивой загрузки, где это условие #equals
не удастся. Какой был бы лучший выбор для преодоления этого? Несколько вариантов, о которых я могу думать, следующие:
- расширить реализацию
equals
, чтобы принять во внимание дело прокси. Минусы: плата за совместимость, жесткая зависимость от инфраструктуры прокси-сервера Hibernate, хакерских, сущностных или доменных моделей должны быть агностическими для используемого ORM, т.е. Поскольку они могут быть повторно использованы в разных контекстах, где нет необходимости в ORM, например. Swing UI. - проверьте, является ли это прокси до вызова
equals
. Минусы: не всегда возможно, т.е. Работа с коллекциями и неявные вызовыequals
, например, Карта. - Воздержитесь от ленивой загрузки. Минусы: не разумны и не эффективны во всех случаях использования.
ОБНОВЛЕНИЕ
Повторное рассмотрение EJ2. Я считаю, что следующее будет работать для всех сценариев (Type-Type, Type-Proxy, Proxy-Type и Proxy-Proxy), но, как указано в одном из комментариев ниже, он может зацикливаться навсегда, если Type сравнивается с совершенно другим типом, например Person.equals(Employee)
и оба используют одинаковые критерии EJ2.
if (this.getClass() != anObject.getClass())
{
return anObject.equals(this);
}