JPA/Hibernate "Класс Composite-id не переопределяет equals()"

Я использую JPA и получаю следующее предупреждение. Я исследовал это и понимаю, почему мне нужно переопределить его и как Hibernate использует эти методы. У меня все еще есть вопрос:

Исключение:

Класс Composite-id не переопределяет equals()

Вопрос:

Почему Hibernate заботится только о классах, у которых нет составных идентификаторов? По умолчанию оно сравнивается с полем @Id, если есть только один подарок, или здесь что-то более сложное?

Ответ 1

Поскольку у сущностей нет составного идентификатора, у них есть один из одного из основных поддерживаемых типов (Integer, Long, String и т.д.), и эти классы уже имеют четко определенный equals()hashCode()).

Ответ 2

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

Взятие из спецификации:

Составной первичный ключ должен соответствовать либо одному постоянному полю или свойству, либо набору таких полей или свойств, как описано ниже. Класс первичного ключа должен быть определен для представления составного первичного ключа. Составные первичные ключи обычно возникают при сопоставлении устаревших баз данных, когда ключ базы данных состоит из нескольких столбцов. Аннотация EmbeddedId или IdClass используется для обозначения составного первичного ключа.

И при использовании составных первичных ключей следует следовать.

  • Основной класс ключа должен быть общедоступным и должен иметь открытый конструктор no-arg.
  • Класс первичного ключа должен быть сериализуемым.
  • Класс первичного ключа должен определять методы equals и hashCode. Семантика равенства значений для этих методов должна быть согласована с равенством базы данных для типов баз данных, к которым отображается ключ.