Введение в Spring Data JPA

1. Общий обзор

Это руководство будет посвящено внедрению Spring Data JPA в проект Spring и полной настройке уровня сохраняемости.

1. Общий обзор  Это руководство будет посвящено внедрению Spring Data JPA в проект Spring и полной настройке уровня сохраняемости. 2.

2. Данные Spring, сгенерированные DAO – Больше никаких реализаций DAO

Как мы уже обсуждали в предыдущей статье, уровень DAO обычно состоит из большого количества шаблонного кода, который можно и нужно упростить. Преимуществ такого упрощения много: уменьшение количества артефактов, которые нам необходимо определять и поддерживать, согласованность шаблонов доступа к данным и конфигурации.

Spring Data делает это упрощение еще на один шаг вперед и
позволяет полностью отказаться от реализаций DAO. Интерфейс DAO теперь является единственным артефактом, который нам нужно явно определить.

Чтобы начать использовать модель программирования Spring Data с помощью JPA, интерфейс DAO должен расширить специфичный для JPA интерфейс репозитория JpaRepository. Это позволит Spring Data находить этот интерфейс и автоматически создавать для него реализацию.

Расширяя интерфейс, мы получаем наиболее подходящие методы CRUD для стандартного доступа к данным, доступные в стандартном DAO.

3. Пользовательский метод доступа и запросы

Как уже говорилось, при реализации одного из интерфейсов репозитория в DAO уже будут определены и реализованы некоторые базовые методы CRUD (и запросы).

Чтобы определить более конкретные методы доступа, Spring JPA поддерживает довольно много опций:

  • просто определите новый метод в интерфейсе
  • предоставьте фактический запрос JPQL, используя аннотацию @Query
  • используйте более продвинутую спецификацию и поддержку Querydsl в Spring Data
  • определяйте пользовательские запросы с помощью именованных запросов JPA

Третий вариант, спецификации и поддержка Querydsl, аналогичен JPA Criteria, но использует более гибкий и удобный API. Это делает всю операцию намного более читаемой и пригодной для повторного использования. Преимущества этого API станут более очевидными при работе с большим количеством фиксированных запросов, поскольку мы потенциально могли бы выразить их более кратко с помощью меньшего количества повторно используемых блоков.

Недостаток последнего варианта заключается в том, что он либо использует XML, либо перегружает доменный класс запросами.

3.1. Автоматические пользовательские запросы

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

Давайте рассмотрим пример. Если у объекта есть поле name (и стандартные методы Java Bean getName и setName),
мы определим метод findByName в интерфейсе DAO. Это автоматически сгенерирует правильный запрос:

public interface IFooDAO extends JpaRepository<Foo, Long> {

Foo findByName(String name);

}

Это относительно простой пример. Механизм создания запроса поддерживает гораздо больший набор ключевых слов.

В случае, если анализатор не сможет сопоставить свойство с полем объекта домена, мы увидим следующее исключение:

java.lang.IllegalArgumentException: No property nam found for type class com.baeldung.jpa.simple.model.Foo

3.2. Пользовательские запросы, выполняемые вручную

Теперь давайте рассмотрим пользовательский запрос, который мы определим с помощью аннотации @Query:

@Query("SELECT f FROM Foo f WHERE LOWER(f.name) = LOWER(:name)")
Foo retrieveByName(@Param("name") String name);

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

4. Конфигурация транзакции

Фактическая реализация DAO, управляемого Spring, действительно скрыта, поскольку мы не работаем с ней напрямую. Однако это достаточно простая реализация, SimpleJpaRepository, которая определяет семантику транзакций с помощью аннотаций.

Более конкретно, здесь используется аннотация @Transactional, доступная только для чтения, на уровне класса, которая затем переопределяется для методов, не доступных только для чтения. Остальная часть семантики транзакций используется по умолчанию, но ее можно легко переопределить вручную для каждого метода.

4.1. Перевод исключений Работает успешно

Теперь возникает вопрос: поскольку Spring Data JPA не зависит от старых шаблонов ORM (JpaTemplate, HibernateTemplate), и они были удалены с Spring 5, собираемся ли мы по-прежнему переводить наши исключения JPA в иерархию исключений Spring DataAccessException?

Ответ, конечно же, таков.
Перевод исключений по-прежнему возможен благодаря использованию аннотации @Repository в DAO. Эта аннотация позволяет Spring beanpostprocessor сообщать всем компонентам @Repository обо всех экземплярах PersistenceExceptionTranslator, найденных в контейнере, и обеспечивать трансляцию исключений, как и раньше.

Давайте проверим трансляцию исключений с помощью интеграционного теста:

@Test(expected = DataIntegrityViolationException.class)
public void whenInvalidEntityIsCreated_thenDataException() {
service.create(new Foo());
}

Имейте в виду, что трансляция исключений выполняется через прокси-серверы. Чтобы Spring мог создавать прокси-серверы для классов DAO, они не должны быть объявлены окончательными.

5. Конфигурация репозитория JPA Spring Data

Чтобы активировать поддержку репозитория Spring JPA, мы можем использовать аннотацию @EnableJpaRepositories и указать пакет, содержащий интерфейсы DAO:

@EnableJpaRepositories(basePackages = "com.baeldung.jpa.simple.repository")
public class PersistenceConfig {
...
}

Мы можем сделать то же самое с конфигурацией XML:

<jpa:repositories base-package="com.baeldung.jpa.simple.repository" />

6. Конфигурация Java или XML

В предыдущей статье мы уже подробно обсуждали, как настроить JPA в Spring. Spring Data также использует поддержку Spring аннотации JPA @PersistenceContext. Это используется для подключения EntityManager к Spring factorybean, ответственному за создание реальных реализаций DAO, JpaRepositoryFactoryBean.

В дополнение к уже рассмотренной конфигурации, нам также необходимо включить конфигурацию Spring Data XML, если мы используем XML:

@Configuration
@EnableTransactionManagement
@ImportResource("classpath*:*springDataConfig.xml")
public class PersistenceJPAConfig {
...
}

7. Зависимость от Maven

В дополнение к конфигурации Maven для JPA, как и в предыдущей статье, мы добавим зависимость spring-data-jpa:

<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
</dependency>

8. Использование пружинного ботинка

Мы также можем использовать JPA-зависимость Spring Boot Starter Data, которая автоматически настроит для нас источник данных.

Нам нужно убедиться, что база данных, которую мы хотим использовать, присутствует в пути к классу. В нашем примере мы добавили базу данных H2 в оперативной памяти:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>

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

Явная конфигурация для стандартного приложения Spring теперь включена как часть автоматической настройки Spring Boot.

Конечно, мы можем изменить автоматическую настройку, добавив нашу индивидуальную явную конфигурацию.

Spring Boot предоставляет простой способ сделать это, используя свойства в файле application.properties. Давайте посмотрим пример изменения URL-адреса подключения и учетных данных:

spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
spring.datasource.username=sa
spring.datasource.password=sa

9. Полезные инструменты для Spring Data JPA

Spring Data JPA поддерживается во всех основных Java IDE. Давайте посмотрим, какие полезные инструменты доступны для Eclipse и IntelliJ IDEA.

Если вы используете Eclipse в качестве IDE, вы можете установить плагин Dali Java Persistence Tools. Это предоставляет ER-диаграммы для объектов JPA, генерацию DDL для инициализации схемы и базовые возможности обратного проектирования. Кроме того, вы можете использовать Eclipse Spring Tool Suite (STS). Это поможет проверить имена методов запроса в JPA-хранилищах данных Spring.

В случае, если вы используете IntelliJ IDEA, есть два варианта.

IntelliJ IDEA Ultimate поддерживает ER-диаграммы, консоль JPA для тестирования инструкций JPQL и полезные проверки. Однако эти функции недоступны в версии Community Edition.

Чтобы повысить производительность в IntelliJ, вы можете установить плагин JPA Buddy, который предоставляет множество функций, включая генерацию объектов JPA, репозитории JPA Spring Data, DTO, сценарии инициализации DDL, миграции версий Flyway, журналы изменений Liquibase и т.д. Кроме того, JPA Buddy предоставляет продвинутый инструмент для обратного проектирования.

Наконец, плагин JPA Buddy работает как с Community, так и с Ultimate editions.

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

В этой статье мы рассмотрели конфигурацию и реализацию уровня сохраняемости с помощью Spring 5, JPA 2 и Spring Data JPA (часть проекта Spring Data umbrella), используя как XML, так и Java-конфигурацию.

Мы обсудили способы определения более
сложных пользовательских запросов, а также семантику транзакций и конфигурацию с новым пространством имен jpa. Конечным результатом является новый и элегантный подход к доступу к данным в Spring, практически без каких-либо усилий по реализации.

Оригинал статьи: https://www.baeldung.com/the-persistence-layer-with-spring-data-jpa