Jakarta Persistence , также известный как JPA (сокращенно от прежнего названия Java Persistence API ), представляет собой спецификацию интерфейса программирования приложений Jakarta EE , которая описывает управление реляционными данными в корпоративных приложениях Java .
Настойчивость в этом контексте охватывает три области:
jakarta.persistence
javax.persistence
Эталонной реализацией для JPA является EclipseLink . [1]
Окончательная дата выпуска спецификации JPA 1.0 — 11 мая 2006 года в рамках Java Community Process JSR 220. Спецификация JPA 2.0 была выпущена 10 декабря 2009 года (платформа Java EE 6 требует JPA 2.0 [2] ). Спецификация JPA 2.1 была выпущена 22 апреля 2013 года (платформа Java EE 7 требует JPA 2.1 [3] ). Спецификация JPA 2.2 была выпущена летом 2017 года. Спецификация JPA 3.1, последняя версия, была выпущена весной 2022 года в рамках Jakarta EE 10. [1]
Сущность сохранения — это облегченный класс Java , состояние которого обычно сохраняется в таблице в реляционной базе данных . Экземпляры такой сущности соответствуют отдельным строкам в таблице. Сущности обычно имеют связи с другими сущностями, и эти связи выражаются через метаданные объектно-реляционного отображения (ORM). Эти метаданные могут быть указаны непосредственно в файле класса сущности с помощью аннотаций или в отдельном файле дескриптора XML , распространяемом вместе с приложением.
Пример класса сущности с метаданными ORM, объявленными с использованием аннотаций (операторы импорта и сеттеры/геттеры опущены для простоты).
@Entity public class Person { @Id private long id ; private String firstName ; private String lastName ; private int age ; }
Аннотация @Entity
объявляет, что класс представляет сущность. @Id
объявляет атрибут, который действует как первичный ключ сущности. Дополнительные аннотации могут использоваться для объявления дополнительных метаданных (например, изменение имени таблицы по умолчанию в @Table
аннотации) или для создания ассоциаций между сущностями.
Jakarta Persistence Query Language (JPQL; ранее Java Persistence Query Language) делает запросы к сущностям, хранящимся в реляционной базе данных. Запросы напоминают запросы SQL по синтаксису, но работают с объектами сущностей, а не напрямую с таблицами базы данных.
До введения спецификации EJB 3.0 многие разработчики корпоративного Java использовали легкие постоянные объекты, предоставляемые либо фреймворками сохранения (такими как Hibernate ), либо объектами доступа к данным (DAO) вместо использования entity beans . Это связано с тем, что entity beans в предыдущих спецификациях EJB требовали гораздо более сложного кода и требовали большого количества ресурсов, и их можно было использовать только на серверах приложений Java EE из-за взаимосвязей и зависимостей в исходном коде между beans и объектами DAO или фреймворками сохранения. Таким образом, многие функции, изначально представленные в сторонних фреймворках сохранения, были включены в Java Persistence API, а такие проекты, как Hibernate и TopLink Essentials, стали реализациями спецификации Java Persistence API.
Спецификация EJB 3.0 (которая сама является частью платформы Java EE 5) включала определение Java Persistence API. Однако разработчикам не нужен контейнер EJB или сервер приложений Java EE для запуска приложений, использующих этот API сохранения. [4] Будущие версии Java Persistence API будут определены в отдельном JSR и спецификации, а не в EJB JSR/спецификации.
Java Persistence API заменяет решение по сохранению данных EJB 2.0 CMP (Container-Managed Persistence).
Java Persistence API был разработан частично для объединения Java Data Objects API и EJB 2.0 Container Managed Persistence (CMP) API. Большинство продуктов, поддерживающих каждый из двух API, поддерживают Java Persistence API.
Java Persistence API определяет сохранение только для систем управления реляционными базами данных , фокусируясь на объектно-реляционном отображении (ORM). Некоторые поставщики JPA поддерживают другие модели баз данных , хотя это выходит за рамки дизайна JPA. Вводная часть спецификации JPA гласит: «Техническая цель этой работы — предоставить средство объектно-реляционного отображения для разработчика приложений Java, использующего модель домена Java для управления реляционной базой данных». [5]
Спецификация объектов данных Java поддерживает ORM, а также сохранение в других типах моделей баз данных, например, в базах данных плоских файлов и базах данных NoSQL , включая базы данных документов , графовые базы данных и многие другие хранилища данных.
Разработчики [6] Java Persistence API стремились обеспечить реляционную персистентность, при этом многие ключевые области были взяты из инструментов объектно-реляционного отображения, таких как Hibernate и TopLink . Java Persistence API улучшил и заменил EJB 2.0, о чем свидетельствует его включение в EJB 3.0. API объектов служебных данных (SDO) (JSR 235) имеет совершенно иную цель, чем Java Persistence API, и считается [7] [8] дополнительным. SDO API разработан для сервисно-ориентированных архитектур , нескольких форматов данных, а не только реляционных данных и нескольких языков программирования. Java Community Process управляет Java-версией SDO API; версия C++ SDO API управляется через OASIS .
Hibernate, основанный Гэвином Кингом, предоставляет объектно-реляционную среду отображения с открытым исходным кодом для Java . Версии 3.2 и более поздние предоставляют реализацию Java Persistence API. [9] [10] Кинг представлял JBoss на JSR 220, [11] экспертной группе JCP, ответственной за разработку JPA. Это привело к продолжающимся спорам и спекуляциям вокруг взаимоотношений между JPA и Hibernate. [ необходима цитата ] Sun Microsystems заявила [12] , что идеи пришли из нескольких фреймворков, включая Hibernate и Java Data Objects .
Spring Data JPA — это реализация абстракции репозитория, которая является ключевым строительным блоком доменно-ориентированного проектирования на основе фреймворка приложений Java Spring . Он прозрачно поддерживает все доступные реализации JPA и поддерживает операции CRUD , а также удобное выполнение запросов к базе данных. [13] : 47 [14]
Разработка новой версии JPA 2.0 началась в июле 2007 года в рамках Java Community Process под названием JSR 317. JPA 2.0 была утверждена в качестве окончательной версии 10 декабря 2009 года. Основное внимание в JPA 2.0 уделялось функциям, которые присутствовали в некоторых популярных поставщиках ORM, но не смогли получить консенсусное одобрение для JPA 1.0.
Основные характеристики:
Поставщики, поддерживающие JPA 2.0:
Разработка версии JPA 2.1 началась в июле 2011 года как JSR 338. JPA 2.1 была утверждена как окончательная 22 мая 2013 года.
Основные характеристики:
Поставщики, поддерживающие JPA 2.1:
Разработка JPA 2.2, релиза поддержки, началась в 2017 году в соответствии с JSR 338. Обзор поддержки был одобрен 19 июня 2017 года.
Основные характеристики:
Поставщики, поддерживающие JPA 2.2:
В 2019 году JPA был переименован в Jakarta Persistence, а в 2020 году была выпущена версия 3.0. Это включало переименование пакетов и свойств с javax.persistence на jakarta.persistence.
Поставщики, поддерживающие Jakarta Persistence 3.0:
Версия 3.1 была выпущена в 2022 году. [1] Она является частью Jakarta EE 10 и, таким образом, для ее работы требуется как минимум Java 11. Она добавляет улучшенную обработку UUID, различные новые функции JPQL для математики и обработки даты/времени, а также другие небольшие изменения. [17]
Поставщики, поддерживающие Jakarta Persistence 3.1:
Hibernate реализует Java Persistence object/relational javaAPI и интерфейсы управления сохранением
Гэвин Кинг — основатель проекта Hibernate
JSR 220, Комитет по спецификациям EJB 3.0, Гэвин Кинг, Билл Берк, Марк Флери
Java Persistence API черпает лучшие идеи из технологий сохранения, таких как Hibernate, TopLink и JDO.