Необходимо ли использовать геттеры в реализации хеш-кода в Hibernate для объектов Proxy? - PullRequest
1 голос
/ 28 апреля 2020

Я знаю, что для метода equals реализация должна быть такой, чтобы избежать проблем в случае возврата Hibernate прокси-объектов.

@Override
public boolean equals(Object o) {
   if (this == o) return true;
   if (!(o instanceof Parent)) return false;

   Parent parent = (Parent) o;

   return getName() != null ? getName().equals(parent.getName()) : parent.getName() == null;
}
  • Мне нужно использовать instanceof. (Если я сравниваю как getClass() != o.getClass(), это всегда будет верно для прокси-объекта o)
  • Я должен использовать геттеры для загрузки прокси-объекта, в противном случае поле будет null.

Но Я также хочу знать, верно ли для реализации hashcode, должен ли я использовать геттеры с учетом объектов прокси?

Должен ли я реализовать так:

public int hashCode() {
   return getName().hashCode();
}

Или это нормально для реализации как это тоже:

public int hashCode() {
   return name.hashCode();
}

Примечание. Предположим, что имя не является пустым полем.

1 Ответ

1 голос
/ 28 апреля 2020

Документация Hibernate говорит :

Приложения, которые будут sh оставаться переносимыми между провайдерами JPA, должны соответствовать следующим требованиям:

...

Постоянное состояние объекта представлено переменными экземпляра, которые могут соответствовать свойствам стиля JavaBean. Переменная экземпляра должна напрямую вызываться только из методов объекта самим экземпляром объекта. Состояние объекта доступно клиентам только через методы доступа объекта (методы получения / установки) или другие бизнес-методы.

Hibernate, однако, не столь строг в своих требованиях. Отличия от приведенного выше списка включают в себя:

...

Hibernate не ограничивает разработчика приложения от предоставления переменных экземпляра и ссылки на них извне самого класса сущности. Однако правильность такой парадигмы в лучшем случае спорна.

И Далее :

Атрибуты (поля или получатели / установщики) не нужно объявлять publi c. Hibernate может работать с атрибутами, объявленными для публичной c, защищенной, пакетной или приватной видимости. Опять же, если вы хотите использовать генерацию прокси во время выполнения для отложенной загрузки, получатель / установщик должен предоставить доступ по крайней мере к видимости пакета.

Итак, я не вижу никаких ограничений для доступа к переменным экземпляра внутри сущности. Но, в любом случае, я бы предложил вам использовать последовательный подход для реализации equals/hashCode.

...