Всем привет, этоЙи Джун@Monday Commuter Radioканал.
0. Прочитав эту статью, вы узнаете
- Как представить Spring Data JPA в проекте Spring
Эта статья имеет в общей сложности около 1800 раз чтения, что примерно равно одной песне.Где любовь? от The Black Eyed Peas.
1 Обзор
В этой статье основное внимание будет уделено тому, как внедрить Spring Data JPA в проект Spring и полностью настроить уровень сохраняемости.
2. DAO, сгенерированный Spring Data — больше нет реализации 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, но использует более гибкий и удобный API. Это делает всю операцию более удобочитаемой и многократно используемой. Преимущества такого API станут более очевидными при работе с большим количеством стандартных запросов, поскольку у нас есть возможность выражать эти запросы более кратко с помощью меньшего количества повторно используемых блоков кода.
Недостатком последнего решения является то, что оно либо использует XML, либо возлагает нагрузку на классы сущностей.
3.1 Автоматический пользовательский запрос
Когда Spring Data создает новую реализацию репозитория, она анализирует все методы, определенные интерфейсом, и пытается автоматически сгенерировать запрос из имени метода. Хотя это имеет некоторые ограничения, это очень мощный и элегантный способ определения новых пользовательских методов доступа с небольшим объемом работы.
Можем посмотреть на примере. Если сущность имеет поле имени и стандартные методы получения и установки Java Bean, мы определим метод findByName в интерфейсе DAO. Это автоматически сгенерирует правильный запрос:
public interface IFooDAO extends JpaRepository<Foo, Long> {
Foo findByName(String name);
}
Это относительно простой пример. Механизм создания запросов поддерживает больше ключевых слов:
Если синтаксический анализатор не может сопоставить свойство с полем объекта домена, мы видим следующее исключение.
java.lang.IllegalArgumentException: No property nam found for type class com.jayxu.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. Настройка транзакций
Реализация управляемого Spring DAO скрыта, потому что мы не используем ее напрямую. Однако это очень простая реализация, т.е.SimpleJpaRepository, который определяет семантику транзакций с помощью аннотаций.
В частности, это использует аннотацию @Transactional только для чтения на уровне класса, а затем переопределяет методы, не предназначенные только для чтения. Остальная семантика транзакций используется по умолчанию, но ее можно легко переопределить вручную каждым методом.
4.1 Перевод исключений все еще в порядке
В Java мы обычно используем оператор try-catch для перехвата исключений для обработки исключений. Но иногда мы используем try-catch для перехвата исключения, но вместо обработки исключения выбрасывается другое исключение, которое называется преобразованием исключений.
Теперь вопрос: поскольку Spring Data JPA не зависит от старых шаблонов ORM (JpaTemplate, HibernateTemplate) и они были удалены с Spring 5, можем ли мы по-прежнему переводить наши исключения JPA в иерархию Spring DataAccessException?
Ответ, конечно, мы делаем. Преобразование исключений по-прежнему может быть достигнуто с помощью аннотации @Repository в DAO. Эта аннотация позволяет постпроцессору Spring Bean информировать все bean-компоненты @Repository обо всех экземплярах PersistenceExceptionTranslator, найденных в контейнере, и обеспечивать перевод исключений, как и раньше.
Давайте проверим перевод исключений с помощью интеграционного теста.
@Test(expected = DataIntegrityViolationException.class)
public void givenFooHasNoName_whenInvalidEntityIsCreated_thenDataException() {
service.create(new Foo());
}
пожалуйста, помните,Трансляция исключений выполняется через прокси. Чтобы Spring мог создавать прокси вокруг классов DAO, эти классы не должны быть объявлены окончательными.
5. Конфигурация репозитория Spring Data JPA
Чтобы активировать поддержку репозитория Spring JPA, мы можем аннотировать @EnableJpaRepositories и указать пакет, содержащий интерфейс DAO.
@EnableJpaRepositories(basePackages = "com.jayxu.spring.data.persistence.repository")
public class PersistenceConfig {
...
}
Мы можем сделать то же самое с конфигурацией XML.
<jpa:repositories base-package="com.jayxu.spring.data.persistence.repository" />
6. Конфигурация Java или XML
Как настроить JPA в Spring, мы подробно обсудим в новой статье. Spring Data также использует поддержку Spring для аннотации JPA @PersistenceContext. Он использует это для подключения EntityManager к фабричному компоненту Spring (JpaRepositoryFactoryBean), ответственному за создание фактической реализации DAO.
В дополнение к уже обсуждаемой конфигурации, если мы используем XML, нам также необходимо включить XML-конфигурацию Spring Data.
@Configuration
@EnableTransactionManagement
@ImportResource("classpath*:*springDataConfig.xml")
public class PersistenceJPAConfig {
...
}
7. Зависимости Maven
В дополнение к конфигурации JPA Maven нам также необходимо добавить зависимость spring-data-jpa.
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>2.4.0</version>
</dependency>
8. Использование Spring Boot
Мы также можем использовать JPA-зависимость Spring Boot Starter Data, которая автоматически настроит для нас источник данных. Нам нужно убедиться, что база данных, которую мы хотим использовать, существует в пути к классам. В нашем случае мы добавили базу данных H2 в памяти.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.6.1</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.200</version>
</dependency>
Просто создав эти зависимости, наше приложение будет запущено и запущено, и мы сможем использовать его для других операций с базой данных. Конфигурация стандартных приложений Spring теперь включена в автоматическую настройку Spring Boot. Конечно, мы можем изменить автоматическую конфигурацию, добавив нашу пользовательскую явную конфигурацию. Spring Boot предоставляет простой способ сделать это, используя свойства в файле application.properties.
spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
spring.datasource.username=sa
spring.datasource.password=sa
В этом примере мы изменили URL-адрес подключения и пароль пользователя.
9. Заключение
В этой статье мы рассмотрели настройку и реализацию уровня сохраняемости Spring Data JPA с использованием конфигурации на основе XML и Java. Мы обсудили, как определить более сложные пользовательские запросы, а также конфигурацию транзакций и новое пространство имен jpa. Теперь Spring может осуществлять доступ к данным новым и элегантным способом, попробуйте.
Спасибо за просмотр этого выпускаЙи Джун@Monday Commuter Radio. Если вы думаете, что это неплохо, поддержите меня три раза подряд, увидимся в следующий раз.