Java Persistence Api (JPA).

JPA — это спецификация, описывающая такую процедуру как маппинг или отображение Java-объектов на данные из обычной БД. То есть это позволяет нам взаимодействовать с данными из обычного хранилища в виде объектов. Так как JPA — это только спецификация, описывающая как это лучше сделать, то существуют соответственно реализации этой спецификации, такие как Hibernate или OpenJPA. Это уже полноценные ORM-фреймворки или, как их еще называют, Persistence Provider, что есть одно и то же. Как выполняется отображение. наиболее простой способ — использование аннотаций. А информация о самой базе данных, параметрах подключения к ней и используемых провайдерах описывается в специальном дескрипторе — файле persistence.xml. В качестве сборщика я использую Maven.

Сущности.

Любая таблица в вашей БД представляет собой сущность, будь то заказчик, автомобиль или книга в магазине. Все это объекты реального мира, которые также можно представить в виде объектов. JPA позволяет легко выполнить маппинг одного на другое. Для этого простой объект Java помечается аннотацией @Entity:

Также в классе нашей сущности должно быть определено поле, соответствующе ключу таблицы. Оно помечается аннотацией @Id. При помощи аннотации @GeneratedValue мы задаем стратегию, на основе которой будет генерироваться новые значения ключа. В данном случае автоматически. После аннотации @Entity вы могли заметить использование еще одной аннотации @Table. Она используется для указания имени таблицы. Вообще, по умолчанию объекту Book сопоставляется таблица book, то же самое происходит и с одноименными полями. Для явного сопоставления имени столбца в таблице реляционной БД с полем класса Book используется аннотация @Column.

Менеджер сущностей.

Центральным элементом в JPA является компонент EntityManager. Именно он содержит методы, связанные с непосредственным сохранением объекта в БД, выборки данных из БД и, если это необходимо, осуществления запросов на специальном языке JPQL.  Он скрывает от вас реальную работу с JDBC и SQL. Для создания объекта EntityManager можно воспользоваться следующим кодом:

В качестве параметра EntityManagerFactory мы передаем имя единицы персистентности, с помощью которой наш менеджер сущностей узнает информацию о параметрах подключения к БД. Единица персистентности (persistence-unit) описывается в специальном конфигурационном файле persistence.xml. Далее вызовом createEntityManager() получаем сам объект менеджера сущностей.
Стоит понимать также, что сам по себе EntityManager — это всего лишь интерфейс, задающий общую схему поведения. Сама реализация интерфейса — это конкретные ORM-фреймворки (или, как их еще называют, PersistenceProvider), например, Hibernate или EclipseLink. В конфигурационном файле persistence.xml вы должны указать используемый вами PersistenceProvider, а также информацию, связанную с параметрами подключения к конкретной БД. Данный файл хранится в каталоге META-INF/resources проекта:

Разберемся поподробнее. В первую очередь нас интересует Persistence Provider, который мы указываем в тегах <provider></provider>. Мы используем Hibernate. Далее мы перечисляем наши классы-сущности, для которых осуществляем отображение. После этого следует перечисление параметров соединения: используемый драйвер (в нашем примере для MySQL), путь к БД, имя пользователя и пароль.

Также в файл pom.xml проекта нужно добавить следующие зависимости:

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

После создания нового объекта Book мы получаем транзакцию — объект EntityTransaction, для начала которой вызываем метод begin(). Для сохранения объекта вызываем метод persist(), передав ему наш объект для сохранения. Наконец, производим подтверждение транзакции методом commit().

Запросы, JPQL и именованные запросы.

JPQL — это специальный язык, используемый для выполнения обычных запросов в объектном стиле. Например, мы хотим найти все книжки Льва Николаевича Толстого. Напишем следующий запрос, объявив аннотацию @NamedQuery на уровне нашего класса модели:

Аннотация @NamedQuery используется для создания так называемых именованных запросов, которые мы ниже будем использовать. Имя запроса будет являться параметром метода, запускающим запрос на выполнение. Сам запрос написан на языке JPQL и, как можно заметить, мы используем запись вида b.author, как при обычном обращении к полю класса в ООП. Для выполнения именованного вопроса вызовем метод createNamedQuery(), передав ему в качестве параметра имя нашего запроса:

Если вы любите русскую классику и заведомо добавили в свою электронную библиотеку пару книг Толстого, то результат вас не огорчит;)
Также, никто вам не запрещает выполнять запросы на обычном SQL. Для этого можно вызывать метод createNativeQuery().

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *