Можно ли использовать метод данных 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 во многих случаях при условии, что:

  • вы не храните постоянные объекты в картах и ​​наборах
  • вы сохраняете конструктор по умолчанию и не пытаетесь каким-либо образом коснуться инициализации объекта (предоставляя значения по умолчанию и т. д.),