Можно ли использовать метод данных equals () класса Kotlin без дальнейшей модификации в сочетании с JPA?

У Kotlin есть класс Data, который поставляется с toString(), equals(), hashCode(), and copy() .

Может ли equals() and hashCode() использоваться «прямо из коробки» без дополнительной настройки для классов JPA? Обычно нам приходится тратить много времени на чтение «Натуральных ключей», жизненного цикла контекста сохранения и т. Д. В статьях, связанных ниже, прежде чем почувствовать уверенность в том, что мы поступаем правильно:

  • Равно и Хаскод
  • заместитель JPA-хэш-равно-дилемма

Можем ли мы теперь просто полагаться на реализации equals() and hashcode() Kotlin сейчас?

На мой взгляд, классы данных в Котлине не должны использоваться, если вы действительно не понимаете, что делаете.

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

В свою очередь, это не позволяет HashSet найти экземпляр, так как он будет искать его в совершенно другой записи в хэш-таблице. Вы не сможете удалить этот экземпляр из HashSet !

Хорошими примерами кандидатов для классов данных в котлин являются: комплексные числа, векторы постоянного размера. Плохие примеры: сущности JPA, DTO.

Что касается JPA, эти статьи упрямны. Есть еще одно мнение: вы не должны переопределять equals и hashCode для сущностей JPA вообще.

Обоснование: провайдеры JPA (Hibernate, EclipseLink) должны гарантировать, что a === b iff a и b имеют один и тот же первичный ключ в таблице, и оба a и b находятся в постоянном состоянии. Этот договор может быть нарушен для отдельных объектов. Но, по-моему, работа с отдельными сущностями – это плохая практика, которой следует избегать. Единственное, что может иметь место, это хранить отдельные элементы, чтобы объединить их в другую транзакцию JPA.

Сущности JPA должны зависеть от идентичности объекта, а не от того, что первичные ключи равны – это примерно 90% того, что касается объектно-реляционного сопоставления. Если реализация JPA проходит через всевозможные циклы, чтобы создавать, поддерживать и распространять карту идентичности, а затем игнорировать ее, это может означать, что вам вообще не нужна JPA, и это вызовет проблемы. Особенно, если вы не осознаете 100% того, что делаете.

Тем не менее, возможно, вы можете использовать классы данных Kotlin во многих случаях при условии, что:

  • вы не храните постоянные объекты в картах и ​​наборах
  • вы сохраняете конструктор по умолчанию и не пытаетесь каким-либо образом коснуться инициализации объекта (предоставляя значения по умолчанию и т. д.),
  • Наследование класса данных Kotlin + метод копирования
  • Kotlin: Коллекция не имеет ни общего типа, ни OneToMany.targetEntity ()
  • Скрипт Kotlin не может получить доступ к ресурсам META-INF (persistence.xml) из jar
  • Kotlin с JPA: по умолчанию конструктор ад
  • Kotlin JPA Инкапсулируйте OneToMany
  • Как сделать необязательным / nullable свойство в hibernate-validator?
  • StackOverflowError с двунаправленными ссылками JPA в Котлине
  • Расчет спящего гиберната @Formula
  • Сопоставление вложенных коллекций с аннотациями JPA спящего режима? Карта <Key, Set <Значение >>
  • Spring JPA не может отображать поле с пользовательским сеттером в классе данных Kotlin
  • BeanDefinitionParsingException при попытке использовать JPA с загрузкой Kotlin и Spring
  • Давайте будем гением компьютера.