Почему JPA требует, чтобы классы сущностей были не финальными, а поля - не финальными - PullRequest
0 голосов
/ 08 апреля 2019

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

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

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

Ответы [ 2 ]

1 голос
/ 08 апреля 2019
  1. Класс не должен быть объявлен как final.Никакие методы или постоянные переменные экземпляра не должны быть объявлены как окончательные.

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

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

Класс должен иметь открытый или защищенный конструктор без аргументов.

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

Постоянные переменные экземпляра должны быть объявлены закрытыми, защищенными или закрытыми для пакета.

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

0 голосов
/ 08 апреля 2019

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

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