При предоставлении реализации #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);
    }