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

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

1. обзор

В этой статье основное внимание будет уделеноintroducing Spring Data JPA into a Spring project и полной настройке уровня сохраняемости. Пошаговое введение в настройку контекста Spring с использованием конфигурации на основе Java и базового Maven pom для проекта см. Вthis article. [more-838] #

2. Spring Data сгенерировал DAO - больше никаких реализаций DAO

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

Spring Data делает это упрощение на шаг вперед иmakes it possible to remove the DAO implementations entirely. Интерфейс DAO теперь является единственным артефактом, который нам нужно явно определить.

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

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

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

Как уже говорилось,by implementing one of the Repository interfaces, the DAO will already have some basic CRUD methods (and queries) defined and implemented.

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

  • простоdefine a new method в интерфейсе

  • предоставить фактическийJPQ query с помощью аннотации@Query

  • используйте более продвинутыйSpecification and Querydsl support в Spring Data

  • определитьcustom queries через именованные запросы JPA

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

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

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

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

Давайте посмотрим на пример: если у объекта есть полеname (и стандартные методы Java BeangetName иsetName),we’ll define the findByName method in the DAO interface; это автоматически сгенерирует правильный запрос:

public interface IFooDAO extends JpaRepository {

   Foo findByName(String name);

}

Это сравнительно простой пример. Механизм создания запроса поддерживаетa much larger set of keywords.

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

java.lang.IllegalArgumentException: No property nam found for type class org.rest.model.Foo

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

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

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

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

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

Фактическая реализация управляемой Spring Data DAO действительно скрыта, поскольку мы не работаем с ней напрямую. Однако это достаточно простая реализация - the SimpleJpaRepository – which defines transaction semantics using annotations.

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

4.1. Исключительный перевод жив и здоров

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

Конечно нет -exception translation is still enabled by the use of the @Repository annotation on the DAO. Эта аннотация позволяет постпроцессору bean-компонента Spring сообщать всем bean-компонентам@Repository все экземплярыPersistenceExceptionTranslator, найденные в контейнере, и обеспечивать преобразование исключений, как и раньше.

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

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

Имейте в виду, чтоexception translation is done through proxies. Чтобы Spring мог создавать прокси вокруг классов DAO, их не следует объявлятьfinal.

5. Конфигурация данных Spring

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

@EnableJpaRepositories(basePackages = "com.example.jpa.dao")
public class PersistenceConfig { ... }

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

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

Мы уже подробно обсуждали, как использоватьconfigure JPA in Spring в предыдущей статье. Spring Data также использует поддержку Spring для аннотации JPA@PersistenceContext. Он использует это для подключенияEntityManager к фабричному компоненту Spring, отвечающему за создание фактических реализаций DAO -JpaRepositoryFactoryBean.

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

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

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

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


   org.springframework.data
   spring-data-jpa
   2.1.6.RELEASE

8. Использование Spring Boot

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

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


   org.springframework.boot
   spring-boot-starter-data-jpa
   2.1.3.RELEASE


    com.h2database
    h2
    1.4.197

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

Явная конфигурация для стандартного приложения 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 4, JPA 2 и Spring Data JPA (часть зонтичного проекта Spring Data) с использованием конфигурации на основе XML и Java.

Мы обсудили способы определения дополнительныхadvanced custom queries, а такжеconfiguration with the new jpa namespace и транзакционную семантику. Конечным результатом является новый и элегантный подход к доступу к данным в Spring, практически не требующий практической реализации.

Реализацию этого учебника Spring Data JPA можно найти вthe GitHub project.