Рубрики
Без рубрики

Введение в весенние данные JPA

Введение в Spring Data JPA с весны 4 – Весенняя конфига, DAO, ручные и генерируемые запросы и управление транзакциями.

Автор оригинала: Eugen Paraschiv.

1. Обзор

Эта статья будет посвящена внедрение Spring Data JPA в весенний проект и полностью настраивая слой настойчивости. Для пошагового введения о настройке контекста Spring с использованием конфигурации на основе Java и базового maven pom для проекта см . эта статья .

Дальнейшее чтение: Путеводитель по JPA с весной Настройка JPA с Spring – как настроить фабрику EntityManager и использовать необработанные API JPA. Читать чаще → CrudRepository, JpaRepository и PagingAndSortingRepository в весенних данных Узнайте о различных вкусах хранилищ, предлагаемых Spring Data. Читать чаще → Упростите DAO с помощью дженериков Spring и Java Упростите уровень доступа к данным с помощью одного, выродимого DAO, что приведет к элегантный доступ к данным , нет ненужных беспорядок. Читать чаще →

2. Весенние данные, генерируемые ДАО – Нет больше DAO реализации

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

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

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

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

3. Метод и запросы пользовательского доступа

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

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

  • просто определить новый метод в интерфейсе
  • обеспечить фактическое Запрос на JP’L с помощью @Query аннотация
  • использовать более продвинутые Спецификация и поддержка запросов весной данные
  • определить пользовательские запросы через JPA Именованные запросы

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

Этот последний вариант имеет недостаток, что он включает в себя XML или обременение класса домена с запросами.

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

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

Рассмотрим пример: если сущность имеет имя поле (и стандарт Java Bean имя и методы ), Мы определим findByName метод в интерфейсе DAO ; это автоматически генерирует правильный запрос:

public interface IFooDAO extends JpaRepository {

    Foo findByName(String name);

}

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

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

java.lang.IllegalArgumentException: No property nam found for type class com.baeldung.spring.data.persistence.model.Foo

3.2. Ручные пользовательские запросы

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

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

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

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

Фактическая реализация ДаО, управляемого весной, действительно скрыта, так как мы не работаем с ним напрямую. Тем не менее, это достаточно простая реализация – ПростойJpaRepository – который определяет семантику транзакций с помощью аннотации .

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

4.1. Перевод исключений жив и здоров

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

Конечно, мы – перевод исключений по-прежнему включен с помощью @Repository аннотация на daO . Эта аннотация позволяет постпроцессору Spring bean консультировать всех @Repository фасоль со всеми НастойчивостьЭксцепцияТранслятор экземпляры, найденные в контейнере, и обеспечивают перевод исключений, как и раньше.

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

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

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

5. Весенняя конфигурация репозитория JPA данных

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

@EnableJpaRepositories(basePackages = "com.baeldung.spring.data.persistence.repository") 
public class PersistenceConfig { 
    ...
}

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

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

Мы уже подробно обсудили, как настроить JPA весной в предыдущей статье. Spring Data также использует поддержку Spring для jpA @PersistenceContext аннотация. Он использует это для провода EntityManager в весенний завод фасоли, ответственных за создание фактических реализаций ДАО – JpaRepositoryFactoryBean .

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

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

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

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


   org.springframework.data
   spring-data-jpa
   2.4.0

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

Мы также можем использовать Весенняя загрузка стартера данных JPA зависимости, которая автоматически настраивает ДанныеИсточник для нас.

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


   org.springframework.boot
   spring-boot-starter-data-jpa
   2.4.0


    com.h2database
    h2
    1.4.200

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

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

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

Spring Boot предоставляет простой способ сделать это, используя свойства в application.properts файл:

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

В этом примере мы изменили URL-адрес соединения и учетные данные.

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

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

Мы обсудили пути определения более расширенные пользовательские запросы , а также транзакционной семантики , и конфигурация с новым JPA пространство имен . Окончательный результат – это новый и элегантный доступ к данным с Spring, практически без фактической работы по реализации.

Внедрение этого весеннего учебника по данным JPA можно найти в проект GitHub .