
Приложение JPA
Сегодня мы напишем приложение JPA для сохранения записи в базе данных и ее извлечения. А сделаем это на машине, на которой выполняется код, установлены MySQL Release 8.0 и база данных с именем CSCS.
Начнем с настройки JPA, Hibernate и других необходимых зависимостей. Исходный код контролируется Apache Maven. Мы декларируем следующие зависимости:
Листинг 1. Зависимости Maven от Hibernate, JUnit Jupiter и MySQL:
Модуль hibernate-entitymanager содержит транзитивные зависимости от других модулей, которые нам понадобятся, таких как hibernate-core заглушки интерфейса JPA.
Нам потребуется зависимость junit-jupiter-engine для выполнения тестов JUnit 5, а также зависимость mysql-connector-java, официальный драйвер JDBC для MySQL.
Вставляем в наш код блок постоянного хранения. Он содержит параметры настройки, в том числе провайдера персистентности, сведения о подключаемой базе данных, классы сущностей, используемый диалект SQL, учетные данные, форматирование SQL и др. Для приложений JPA требуется один или несколько блоков постоянного хранения.
Блок постоянного хранения
Файл persistence.xml находится в resources/META-INF/. Его содержимое выглядит следующим образом:
Листинг 2. Файл конфигурации persistence.xml
- Поскольку JPA — это только спецификация, нам необходимо указать связанную с вендором реализацию PersistenceProvider для API. Определяемая нами персистентность поддерживается провайдером Hibernate. #1
- Указываем свойства JDBC properties - драйвер #2, URL базы данных #3, имя пользователя #4 и пароль #5 для доступа. На машине, на которой выполняются программы, установлена база данных MySQL 8, и для доступа используются учетные данные из файла persistence.xml.
- Диалект Hibernate — MySQL8 #6, так как мы будем взаимодействовать с базой данных MySQL Release 8.0.
- Каждый раз, когда выполняется программа, база данных создается заново с нуля #7. Это идеально для автоматизированного тестирования, когда нам для запуска каждого теста нужна чистая база данных.
Персистентный класс
Реализуемое приложение имеет персистентный класс Item:
Листинг 3. Класс Item
- Для персистентных классов необходимо использовать аннотацию @Entity #1, чтобы указать, что они соответствуют таблице базы данных. Если имя таблицы не указано, этот класс будет по умолчанию отображаться на таблицу с именем ITEM.
- Для персистентных классов необходимо использовать аннотацию @Id #2, чтобы указать соответствие первичному ключу таблицы базы данных. Этот атрибут будет отображаться на столбец ID.
- Аннотация @GeneratedValue указывает на автоматическую генерацию первичных ключей #3. Здесь можно использовать самые разные стратегии в зависимости от базы данных: поля идентификации, значения, полученные от последовательности, или таблица.
- Атрибуты будут отображаться в столбцы таблицы. Если имя столбца не указано, атрибут info #4 будет по умолчанию отображаться в столбец с именем INFO.
Сохранение и извлечение записей
Давайте сохраним новую запись в базу данных.
Листинг 4. Класс ItemJPATest
- Для доступа к базе данных #1 нам нужна фабрика EntityManagerFactory. Эта фабрика соответствует блоку постоянного хранения, который мы определили ранее.
- Создаем EntityManager и запускаем новую сессию базы данных #2.
- Получаем доступ к API для стандартных транзакций и начинаем транзакцию #3.
- Создаем новый экземпляр класса Item и устанавливаем его свойство info #4.
- Экземпляр класса во временном состоянии становится персистентным на стороне контекста персистентности #5.
- Подтверждаем транзакцию #6. Теперь в таблицу ITEM добавлен новый ряд. Доступ к базе данных должен быть транзакционным, даже если она только для чтения.
- После создания EntityManager его необходимо закрыть #7.
- После создания EntityManagerFactory его необходимо закрыть #8.
- В приложении JPA нет кода SQL и не используется JDBC. В коде Java нет операций CRUD (create, read, update, delete), но можно работать объектно-ориентированным способом с классами, объектами и методами. Перевод на каждый диалект SQL осуществляется посредством объектно-реляционного отображения (ORM), которое также используется для переносимости.
Интересно и программирование с помощью Java или хотите прокачать свои навыки? Регистрируйтесь на наши тренинги и получите скидку 10% для всех физлиц!