Перейти к основному содержимому

Руководство по JPA Buddy

· 6 мин. чтения

1. Обзор

JPA Buddy — это широко используемый плагин IntelliJ IDEA, предназначенный как для новых, так и для опытных разработчиков, которые работают с моделью данных JPA и связанными технологиями, такими как Spring Data JPA , инструменты управления версиями БД ( Flyway , Liquibase ), MapStruct и некоторые другие. Плагин предоставляет визуальные дизайнеры, генерацию кода и дополнительные проверки, которые должны упростить разработку и улучшить код в соответствии с лучшими практиками для JPA.

Плагин работает как с версиями IntelliJ IDEA Community, так и с Ultimate и использует модель «freemium». Большинство функций доступны бесплатно, и нам нужно будет купить подписку, чтобы получить доступ к платным.

В этом уроке мы рассмотрим основные функции плагина и посмотрим, как мы можем использовать их в цикле разработки приложения. В качестве примера возьмем популярное эталонное приложение — Spring PetClinic .

2. Начало работы

Мы можем автоматически активировать JPA Buddy при добавлении зависимости JPA в исходный код приложения. Плагин находится в списке «Рекомендуемые плагины InteiilJ», поэтому, даже если он не установлен, IDEA предложит нам это сделать. Мы также можем установить плагин с торговой площадки IntelliJ:

./f590463d35406ea84161d10791e68e14.png

Функциональность JPA Buddy может различаться в зависимости от библиотек, подключенных к приложению. Например, мы не увидим меню для генерации сценариев управления версиями БД, если у нас нет ни Liquibase, ни Flyway.

3. Работа с объектами JPA

Обычно разработка приложения начинается с модели данных. JPA Buddy предоставляет визуальный дизайнер и палитру компонентов, которые позволяют нам создавать объект и добавлять к нему основные атрибуты и ассоциации. Мы можем вызвать соответствующее действие из контекстного меню или окна инструмента JPA Structure:

./98c14479e71d58c63c6ec642a7c3945d.png

Если нам нужно добавить или отредактировать атрибут объекта, мы можем использовать палитру и инспектор JPA. Чтобы добавить атрибут, нам нужно дважды щелкнуть по нему или выполнить перетаскивание. Визуальный редактор позволяет нам определить свойства атрибута:

./d47594cb431f84489ef1712f8ad68097.png

Чтобы отредактировать атрибут объекта, мы можем использовать инспектор JPA. Согласно спецификациям JPA, инспектор позволяет нам просматривать и редактировать почти все параметры атрибута объекта. Редактор работает в обоих направлениях: когда мы обновляем свойство атрибута, код обновляется. И наоборот, при обновлении кода сущности все изменения отражаются в инспекторе.

3.1. Поддержка Ломбок

Согласно спецификациям JPA, объекты должны иметь геттеры и сеттеры для атрибутов, и это часто рассматривается как «шаблонный» код. Lombok — популярная библиотека, которая позволяет нам не писать шаблонный код и заменить его парой аннотаций. Многие разработчики используют Lombok в определении сущностей JPA, поэтому JPA Buddy полностью его поддерживает. Мы можем редактировать свойства, связанные с Lombok, в инспекторе JPA:

./e76e2235bcfd5b72e893281673cc835b.png

Функционал плагина не ограничивается просмотром и редактированием. Важной частью поддержки являются проверки. Некоторые аннотации Lombok могут вызвать проблемы с производительностью или непредвиденные ошибки при использовании с JPA. Например, использование аннотации @ToString может вызвать исключение LazyInitException, поскольку оно использует все атрибуты для представления строки объекта, включая ленивые.

JPA Buddy показывает предупреждения для таких случаев и предоставляет быстрые исправления, что помогает нам избежать ошибок в коде JPA:

./66fd899b69f1d604ddfd231cebf0822e.png

4. Миграция БД с помощью Liquibase и Flyway

Чтобы создать базу данных из модели данных JPA, мы обычно используем инструменты управления версиями БД; Liquibase и Flyway — два крупных игрока в этой области. Наиболее подверженной ошибкам частью процесса миграции БД является написание сценария миграции на основе изменений объекта JPA. JPA Buddy обеспечивает генерацию дифференциальных сценариев схемы как для Liquibase, так и для Flyway. Плагин может сравнивать существующую схему БД с моделью JPA или даже с двумя схемами:

./6a866cc4deaa7085f740f185ba335d24.png

В дополнение к этому JPA Buddy обеспечивает автодополнение скриптов и интеллектуальный предварительный просмотр. В этом режиме плагин анализирует сгенерированные скрипты и показывает предупреждение, если изменения могут вызвать сбои в целевом источнике данных при обновлении:

./ed8090b2c7f6b445099d0e237ef3665f.png

5. Поддержка Spring Data JPA

Когда модель данных создана, следующим шагом является реализация репозиториев доступа к данным. Spring Data JPA, пожалуй, самый популярный фреймворк для этого. JPA Buddy позволяет нам создавать новые репозитории на основе определений сущностей. В коде репозитория мы можем использовать палитру JPA для создания различных производных методов и запросов в коде репозитория с помощью визуальных инструментов:

./c75ac4972f24295c4d3d02f46ec1931d.png

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

./cc77cfc0038334b3eec9ada012cd525c.png

Еще одна полезная функция — извлечение запросов. Иногда имена производных методов могут стать слишком длинными для таких сложных запросов, как этот:

List<Owner> findDistinctByFirstNameIgnoreCaseOrLastNameIgnoreCaseOrPets_NameIgnoreCaseAllIgnoreCaseOrderByFirstNameAsc(
String firstName, String lastName, String name);

JPA Buddy анализирует производное имя метода и позволяет нам реорганизовать его, переименовав и переместив запрос JPQL в аннотацию @Query :

./c53357b74bcd9f3604ab1bc8336f8459.png

@Query("select distinct o from Owner o left join o.pets pets " +
"where upper(o.firstName) = upper(:firstName) " +
"or upper(o.lastName) = upper(:lastName) " +
"or upper(pets.name) = upper(:name) " +
"order by o.firstName")
List<Owner> findByAnyName(@Param("firstName") String firstName,
@Param("lastName") String lastName,
@Param("name") String name);

6. Генерация сущностей на основе таблиц БД

Данные обычно переживают код, поэтому, когда мы создаем уровень данных JPA поверх существующей базы данных, нам нужно создавать объекты JPA на основе текущих таблиц. JPA Buddy предоставляет эту функциональность и позволяет разработчикам создавать объекты по принципу «выбора вишен», выбирая таблицы одну за другой:

./85ebdd0862c1a3492ef68aac437c7155.png

В отличие от существующих решений, плагин выполняет «умную» генерацию и пытается обнаружить ассоциации между сущностями. Мы сгенерируем соответствующие атрибуты даже для сущностей OneToMany и ManyToMany , которые не поддерживаются столбцами:

./b4bd69cc8bbfafd983901a6343e4666e.png

JPA Buddy генерирует «пустые» объекты только со столбцом идентификатора и комментарием TODO в теле для таких ассоциаций. Нажав на этот TODO, мы можем запустить процесс импорта столбца для существующей сущности:

./130a11875823b35067e7761965c5a0a0.png

7. Генерация DTO и картографов

DTO — ценный шаблон проектирования для случая передачи данных, которые мы не можем напрямую сопоставить с объектами JPA. Например, при создании REST API мы можем захотеть предоставить доступ только к некоторым атрибутам сущности.

JPA Buddy может генерировать DTO и преобразователи с помощью библиотеки MapStruct. Все, что нам нужно сделать, это выбрать нужные атрибуты для сгенерированных DTO:

./fc03a09d51abea4e9d9bd241f2409dbc.png

Плагин генерирует DTO и сопоставитель, включая правильное сопоставление для ассоциаций. JPA Buddy также поддерживает Lombok для этого случая и генерирует правильные аннотации для DTO:

@Data
public class OwnerDto implements Serializable {
private final Integer id;
@NotEmpty
private final String firstName;
@NotEmpty
private final String lastName;
private final List<PetDto> pets;
}

8. Минималистичный режим

JPA Buddy имеет дружественный пользовательский интерфейс, но для тех, кто предпочитает «сфокусированный» вид в IntelliJ IDEA, плагин предоставляет «минималистичный режим». Мы можем скрыть все окна инструментов и использовать клавиатуру только для создания сущностей, создания и редактирования репозиториев Spring Data JPA, вызова мастеров создания DTO и так далее:

./6edc83e2be8bec496b528def14fbf265.png

9. Заключение

JPA Buddy предоставляет набор мощных инструментов, упрощающих разработку JPA. Преимущество плагина в том, что он поддерживает не только JPA, но и связанные библиотеки, используемые при разработке уровня доступа к данным: Spring Data JPA, MapStruct, Lombok и решения для управления версиями БД.

Если рассматривать IntelliJ IDEA Community, этот плагин может существенно упростить работу с JPA. Пользователи IDEA Ultimate могут получить некоторые функции JPA Buddy из комплектных подключаемых модулей для поддержки JPA и Spring Framework. Тем не менее, похоже, что функции генерации сценариев управления версиями БД и создания DTO остаются уникальными в автоматизации разработки БД.

Для тех, кто предпочитает формат видео, есть пятнадцатиминутная запись, показывающая JPA Buddy в действии. Мы можем увидеть, как создать приложение с JPA Buddy и Spring Boot с использованием IntelliJ IDEA:

iFrame should be here.