Почему JPA требует, чтобы классы Entity были не окончательными, а поля не окончательными

Читал о JPA здесь. Два требования к классу Entity заключаются в том, что

  1. Класс не должен быть объявлен окончательным. Никакие методы или постоянные переменные экземпляра не должны быть объявлены как final.
  2. Класс должен иметь общедоступный или защищенный конструктор без аргументов.
  3. Постоянные переменные экземпляра должны быть объявлены как private, protected или package-private.

Было любопытно узнать, зачем нужны эти условия?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
433
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий
  1. The class must not be declared final. No methods or persistent instance variables must be declared final.

Реализации JPA используют прокси-серверы перед вашими сущностями для управления, например: отложенной загрузкой. Поскольку окончательный класс не может быть расширен, нельзя создать прокси.

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

  1. The class must have a public or protected, no-argument constructor.

Эти и другие фреймворки для создания новых объектов используют ```Class.newInstance()``, поэтому конструктор без аргументов не нужен.

  1. Persistent instance variables must be declared private, protected, or package-private.

Будучи доступным только через методы доступа или бизнес-методы, допускается перехват в прокси.

Привет спасибо! Можете ли вы также сказать, что они имеют в виду, когда говорят «базовый тип языка программирования Java» в том же документе. Я думаю, что они могут иметь в виду примитивные типы данных, но не уверен.

Chirag 08.04.2019 17:39

Да, в этом случае я бы сказал, что это больше, чем просто обертки объектов. Например: Integer вместо int. Но да, в основном, если вы используете карту для сопоставления отношений, ключ должен быть базового типа, объекта или встраиваемого. Если вы считаете, что мой ответ в порядке, можете проверить: stackoverflow.com/help/someone-answers

Pablo AM 08.04.2019 19:31

Причины (по крайней мере некоторые из них):

  1. Поставщику JPA необходимо динамически создавать экземпляры объекта. Если бы класс содержал единственный конструктор, который принимает произвольные аргументы, провайдер JPA не мог бы определить значения для этих аргументов. Вот почему он должен иметь конструктор без аргументов.
  2. Реализации JPA имеют дело с сохраняющимися экземплярами ваших классов сущностей. поэтому класс, методы и переменные не могут быть окончательными.
  3. Поскольку вам не нужен прямой доступ к переменным извне, чтобы сохранить инкапсуляция - это причина ООП. Другая причина заключается в том, что многие структуры постоянства имеют метод получения/установки для определения "свойств" POJO.

Другие вопросы по теме