Не используй Lombok с JPA, пока не посмотришь это видео | Amplicode

Поділитися
Вставка
  • Опубліковано 2 жов 2024

КОМЕНТАРІ • 29

  • @nostradamus_tech
    @nostradamus_tech 3 місяці тому +15

    По кайфу брат, чёткий базар держишь, разложил для пацанов всё по полочкам. Ровный ты чувак, респект и уважуха со всего нашего района

    • @amplicode
      @amplicode  3 місяці тому

      Спасибо большое!

    • @albion_faults
      @albion_faults 2 місяці тому

      Камент агонь

  • @bltvg
    @bltvg 2 місяці тому +3

    Парни, классное дело делаете. Плагин ампликод - просто находка. Случайно на него нарвался на ютубе, теперь думаю, как же я раньше жил без него!
    Но пример теста, где используется HashSet изначально неверен. Хешмапы, а также структуры, основанные на них, к коим относится HashSet, должны использовать иммутабельные элементы, чтобы значение hashCode() не менялось. Но поскольку jpa-сущность неудобно делать иммутабельной, то и кейса, где мы кладём её в HashSet быть не должно. Соответственно раз нет кейса, то и теста в реальном мире быть не может.
    Впрочем, допускаю, что этот кейс вы сделали искусственно, чтобы разобрать, что такое hashCode.

  • @abobafd
    @abobafd Місяць тому

    Почему простой instanceof не подойдет? У нас же прокси хибернейтовский наследует исходный класс, следовательно для подклассов исходного класса(например прокси) instanceof вернет true. В hibernate 6.5 user guide, секции 3.4.7 написано решение как и от Влада Михалыча на стек оверфлоу (мб он это и написал там).

  • @MaksRakataks
    @MaksRakataks 2 місяці тому +1

    Это же делает JPA Buddy, у них есть статья полностью разбирающая эту проблему.

    • @amplicode
      @amplicode  2 місяці тому +1

      Наша команда JPA Buddy и разрабатывала) продуктовая преемственность

    • @mqtrade5743
      @mqtrade5743 2 місяці тому +1

      Ответ в стиле - да, это я сделал😀😀😀

  • @bltvg
    @bltvg 2 місяці тому

    В реализации hashCode от ампликода, хешкод вычисляется не из полей (всех или не всех) объекта, а берётся из хешкода объекта типа Class, если я правильно понял. Сомнительно как-то. Это значит у разных объектов одного класса хешкод будет один. Т.е., если мы положим в тот же HasSet, несколько элементов такого класса, в итоге в сете останется один элемент.

    • @KirillBalod
      @KirillBalod 2 місяці тому

      Нет, в сете останутся элементы, с одинаковым hashCode и equals

  • @erlanibraev
    @erlanibraev 2 місяці тому

    Зачем нужен lombok, если есть Kotlin. 😂

    • @Selavy82
      @Selavy82 2 місяці тому

      Зачем нужен Kotlin, если есть Scala?

  • @ender_man1576
    @ender_man1576 3 місяці тому

    Спасибо за видео. Только начал изучать спринг, больше бы таких видосов с фишками и лучшими практиками

    • @amplicode
      @amplicode  3 місяці тому

      Спасибо за фидбек! Обязательно продолжим выпускать подобный контент :)

  • @pilotivanovich
    @pilotivanovich 3 місяці тому

    объясните, почему у разных объектов одного класса будет одинаковый hashCode в вашем варианте ?

    • @amplicode
      @amplicode  3 місяці тому +1

      Добрый день!
      Потому что в моём случае мы отталкиваемся от имени класса. А имя класса у двух объектов будет одинаковое.
      Если будет прокси, то мы получим имя оригинального класса и возьмём от него хэшкод:
      instanceof HibernateProxy ? ((HibernateProxy) this).getHibernateLazyInitializer().getPersistentClass().hashode()
      А если будет оригинальный класс, то сразу возьмём хэшкод:
      getClass().hashCode()

    • @pilotivanovich
      @pilotivanovich 3 місяці тому

      @@amplicode спасибо!

    • @VasillaRobocraft
      @VasillaRobocraft 3 місяці тому

      ​@@amplicode
      Так если hashcode считается на основе имени класса, разве он не окажется одинаковым для абсолютно любых инстансов?

    • @abobafd
      @abobafd 3 місяці тому

      ​@@VasillaRobocraft окажется

  • @МарияБорцова-ю1к
    @МарияБорцова-ю1к 3 місяці тому

    Какую книгу посоветуете о подобных нюансах?

    • @amplicode
      @amplicode  3 місяці тому

      Добрый день! Сомневаюсь, что есть подобная книжка, по крайней мере я о такой не слышал :)
      Так что рекомендую подписаться на канал тут и в телеграм: t.me/amplicode
      Чтобы если мы найдём еще подводных камней, то вы точно не пропустили)

    • @ГеннадийВенидиктов
      @ГеннадийВенидиктов 2 місяці тому +2

      Советую, почитать книгу Джошуа Блоха "Java Эффективное программирование" там есть отдельная глава про эти методы так же в фундаментальных книгах по java например Кей Хорстман "Java Библиотека профессионала. Том 1" есть глава про эти методы и там много интересного про equals, hashCode и их связку с наследованием

  • @TheSemenFarada
    @TheSemenFarada 2 місяці тому

    У нас на проекте запрещен ламбок - и я с этим абсолютно согласен. Бесполезная библиотека которая только заставляет вспоминать что и какая аннотация значит. Современные ide генерят геттеры сеттеры быстрее чем добавить ламбок анготации, зато потом все понятно и прозрачно, ентити можно читать как документацию. Где есть сеттеры значит это изменяемый параметр, а где нету значит инициализируеься только в конструкторе

    • @kergshi9847
      @kergshi9847 2 місяці тому +5

      Ахахах! Бесполезная,ага) Ну если вам так сложно запомнить значения нескольких аннотаций по типу @Getter @Setter и т.д,то я вам сочувствую)

    • @mqtrade5743
      @mqtrade5743 2 місяці тому

      Тоже предпочитаю ломбок - кода меньше

    • @shimmyshimmyyea
      @shimmyshimmyyea 2 місяці тому +2

      скажи что за проект чтобы нормальные люди туда не вляпались случайно

    • @bukaejja
      @bukaejja 2 місяці тому +1

      Сгенерированные геттеры и сеттеры не несут никакой полезной информации. Скорее наоборот, могут смутить, если один из них нужно переопределить, добавив кастомной логики. А если тебе надо неизменяемые поля, ты же все равно сделаешь их final?

    • @bltvg
      @bltvg 2 місяці тому +2

      С ломбоком код становится лаконичнее, а значит понятнее. А изменение кода проще. Если тебе нужно добавить/удалить поле, изменить имя/тип поля, то надо просто это сделать. Не надо создавать/изменять геттеры и сеттеры, изменять конструкторы, билдеры, equals, hashCode и прочие методы.