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

Spring data что это

  • автор:

Spring data что это

Spring Data JPA

Spring Data JPA упрощает разработку JPA-приложений. Этот модуль расширяет поддержку JPA-слоя доступа к данным, а также облегчает разработку Spring-приложений, использующих технологии доступа к данным.

Введение

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

Возможности

  • Поддержка создания репозиториев, основаных на Spring и JPA
  • Поддержка Querydsl, т.е. типобезопасные JPA запросы
  • Прозрачный аудит для доменных классов
  • Разбивка на страницы, динамическое выполнение запросов, возможность интегрировать собственный код для доступа к данным
  • Проверка запроса во время загрузки при указании аннотации @Query
  • Поддержка XML-конфигурирования для сущностей
  • Поддержка Java-конфигурирования репозиторий при указании аннотации @EnableJpaRepositories

Доступ к данным через JPA

Этот урок освещает процесс создания приложения, которое использует Spring Data JPA для сохранения и получения данных из реляционной БД.

Что вы создадите

Вы создадите приложение, которое сохраняет Customer POJO в БД в ОЗУ.

Что вам потребуется

  • Примерно 15 минут свободного времени
  • Любимый текстовый редактор или IDE
  • JDK 6 и выше
  • Gradle 1.11+ или Maven 3.0+
  • Вы также можете импортировать код этого урока, а также просматривать web-страницы прямо из Spring Tool Suite (STS), собственно как и работать дальше из него.

Как проходить этот урок

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

Чтобы начать с нуля, перейдите в Настройка проекта.

  • Загрузите и распакуйте архив с кодом этого урока, либо кнонируйте из репозитория с помощью Git: git clone https://github.com/spring-guides/gs-accessing-data-jpa.git
  • Перейдите в каталог gs-accessing-data-jpa/initial
  • Забегая вперед, опишите простую сущность

Когда вы закончите, можете сравнить получившийся результат с образцом в gs-accessing-data-jpa/complete .

Настройка проекта

Для начала вам необходимо настроить базовый скрипт сборки. Вы можете использовать любую систему сборки, которая вам нравится для сборки проетов Spring, но в этом уроке рассмотрим код для работы с Gradle и Maven. Если вы не знакомы ни с одним из них, ознакомьтесь с соответсвующими уроками Сборка Java-проекта с использованием Gradle или Сборка Java-проекта с использованием Maven.

Создание структуры каталогов

В выбранном вами каталоге проекта создайте следующую структуру каталогов; к примеру, командой mkdir -p src/main/java/hello для *nix систем:

└── src └── main └── java └── hello

Создание файла сборки Gradle

Ниже представлен начальный файл сборки Gradle. Файл pom.xml находится здесь. Если вы используете Spring Tool Suite (STS), то можете импортировать урок прямо из него.

Если вы посмотрите на pom.xml , вы найдете, что указана версия для maven-compiler-plugin. В общем, это не рекомендуется делать. В данном случае он предназначен для решения проблем с нашей CI системы, которая по умолчанию имеет старую(до Java 5) версию этого плагина.

buildscript < repositories < maven < url "http://repo.spring.io/libs-release" >mavenLocal() mavenCentral() > dependencies < classpath("org.springframework.boot:spring-boot-gradle-plugin:1.1.8.RELEASE") >> apply plugin: 'java' apply plugin: 'eclipse' apply plugin: 'idea' apply plugin: 'spring-boot' jar < baseName = 'gs-accessing-data-jpa' version = '0.1.0' >repositories < mavenLocal() mavenCentral() maven < url "http://repo.spring.io/libs-release" >maven < url "https://repository.jboss.org/nexus/content/repositories/releases" >> dependencies < compile("org.springframework.boot:spring-boot-starter-data-jpa") compile("com.h2database:h2") testCompile("junit:junit") >task wrapper(type: Wrapper)

Spring Boot gradle plugin предоставляет множество удобных возможностей:

  • Он собирает все jar’ы в classpath и собирает единое, исполняемое «über-jar», что делает более удобным выполнение и доставку вашего сервиса
  • Он ищет public static void main() метод, как признак исполняемого класса
  • Он предоставляет встроенное разрешение зависимостей, с определенными номерами версий для соответсвующих Spring Boot зависимостей. Вы можете переопределить на любые версии, какие захотите, но он будет по умолчанию для Boot выбранным набором версий

Описание простой сущности

В этом примере, вы сохраняете Customer объекты, аннотированные как JPA сущность.

package hello; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity public class Customer < @Id @GeneratedValue(strategy=GenerationType.AUTO) private long id; private String firstName; private String lastName; protected Customer() <>public Customer(String firstName, String lastName) < this.firstName = firstName; this.lastName = lastName; >@Override public String toString() < return String.format( "Customer[id=%d, firstName='%s', lastName='%s']", id, firstName, lastName); >> 

Здесь у вас есть класс Customer с тремя атрибутами id , firstName и lastName . У вас также есть два конструктора. Конструктор по умолчанию существует только из-за JPA. Вы не будете его использовать напрямую, потому что он определен как protected . Другой конструктор вы будете использовать для создания экземпляра Customer , чтобы сохранить его в БД.

В этом уроке типичные методы получения и установки опущены для краткости.

Класс Customer аннотирован как @Entity , означая, что он является JPA сущностью. Из-за отсутствия аннотации @Table , предполагается, что сущность будет соответствовать таблице с названием Customer .

Свойство id класса Customer аннотировано как @Id , так что JPA распознает его как ID объекта. Свойство id также аннотировано как @GeneratedValue , означая, что ID должен генерироваться автоматически.

Другие два свойства, firstName и lastName остались не аннотированными. Это значит, что они будут соответствовать колонкам с такими же названиями и параметрами.

Метод tostring будет печатать свойства объекта.

Создание простых запросов

Spring Data JPA ориентирована на использование JPA для сохранения данных в реляционную БД. Наиболее полезной её возможностью является автоматическое создание реализаций репозитория во время выполнения из интерфейса.

Чтобы увидеть, как это работает, создайте интерфейс репозитория, который работает с сущностями Customer :

package hello; import java.util.List; import org.springframework.data.repository.CrudRepository; public interface CustomerRepository extends CrudRepository  < ListfindByLastName(String lastName); >

CustomerRepository расширяет CrudRepository интерфейс. Тип сущности и ID, Customer и Long , указаны в общих параметрах CrudRepository . Расширяя CrudRepository , CustomerRepository наследует несколько методов для работы с Customer , включая методы сохранения, удаления и поиска.

Spring Data JPA позволяет также определить и другие методы запросов, просто описав сигнатуры метода. В данном случае, таковым является метод findByLastName() .

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

Приступим к работе и посмотрим, что он найдет!

Создание класса Application

Создайте класс Application со всеми компонентами.

package hello; import java.util.List; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Configuration; @Configuration @EnableAutoConfiguration public class Application < public static void main(String[] args) < ConfigurableApplicationContext context = SpringApplication.run(Application.class); CustomerRepository repository = context.getBean(CustomerRepository.class); // save a couple of customers repository.save(new Customer("Jack", "Bauer")); repository.save(new Customer("Chloe", "O'Brian")); repository.save(new Customer("Kim", "Bauer")); repository.save(new Customer("David", "Palmer")); repository.save(new Customer("Michelle", "Dessler")); // fetch all customers Iterablecustomers = repository.findAll(); System.out.println("Customers found with findAll():"); System.out.println("-------------------------------"); for (Customer customer : customers) < System.out.println(customer); >System.out.println(); // fetch an individual customer by ID Customer customer = repository.findOne(1L); System.out.println("Customer found with findOne(1L):"); System.out.println("--------------------------------"); System.out.println(customer); System.out.println(); // fetch customers by last name List bauers = repository.findByLastName("Bauer"); System.out.println("Customer found with findByLastName('Bauer'):"); System.out.println("--------------------------------------------"); for (Customer bauer : bauers) < System.out.println(bauer); >context.close(); > >

В конфигурацию вам необходимо добавить аннотацию @EnableAutoConfiguration . Эта аннотация говорит Spring Boot конфигурировать JPA репозитории и сущности из текущего пакета. Поэтому для любых интерфейсов, которые расширяют org.springframework.data.repository.Repository , будут автоматически сгенерированы реализации. Расширяя JpaRepository , ваш интерфейс CustomerRepository транзитивно расширяет Repository . Следовательно, Spring Data JPA будет находить его и создавать для вас реализацию.

Application включает метод main() , который использует CustomerRepository в нескольких тестах. Для начала, он получает CustomerRepository из контекста приложения Spring. Затем он сохраняет несколько объектов Customer через метод save() . Далее, вызывается findAll() для получения всех объектов Customer из БД. Затем вызывается finfOne() для получения единственного customer по его ID. В заключении, вызывается findByLastName() для получения всех объектов с фамилией «Bauer».

Сборка исполняемого JAR

Вы можете собрать единый исполняемый JAR-файл, который содержит все необходимые зависимости, классы и ресурсы. Это делает его легким в загрузке, версионировании и развертывании сервиса как приложения на протяжении всего периода разработки, на различных средах и так далее.

./gradlew build

Затем вы можете запустить JAR-файл:

java -jar build/libs/gs-accessing-data-jpa-0.1.0.jar

Если вы используете Maven, вы можете запустить приложение, используя mvn spring-boot:run , либо вы можете собрать приложение с mvn clean package и запустить JAR примерно так:

java -jar target/gs-accessing-data-jpa-0.1.0.jar

Процедура, описанная выше, создает исполняемый JAR. Вы также можете вместо него собрать классический WAR-файл.

Если вы используете Gradle, вы можете запустить ваш сервис из командной строки:

./gradlew clean build && java -jar build/libs/gs-accessing-data-jpa-0.1.0.jar

Если вы используете Maven, то можете запустить ваш сервис таким образом: mvn clean package && java -jar target/gs-accessing-data-jpa-0.1.0.jar .

Как вариант, вы можете запустить ваш сервис напрямую из Gradle примерно так:

./gradlew bootRun

С mvn — mvn spring-boot:run .

Вы должны увидеть следующее:

== Customers found with findAll(): Customer[id=1, firstName='Jack', lastName='Bauer'] Customer[id=2, firstName='Chloe', lastName='O'Brian'] Customer[id=3, firstName='Kim', lastName='Bauer'] Customer[id=4, firstName='David', lastName='Palmer'] Customer[id=5, firstName='Michelle', lastName='Dessler'] == Customer found with findOne(1L): Customer[id=1, firstName='Jack', lastName='Bauer'] == Customer found with findByLastName('Bauer'): Customer[id=1, firstName='Jack', lastName='Bauer'] Customer[id=3, firstName='Kim', lastName='Bauer']

Итог

Поздравляем! Вы только что написали простое приложение с использованием Spring Data JPA для сохранения объектов в БД и для их получения — и все это без написания реализации репозитория.

С оригинальным текстом урока вы можете ознакомиться на spring.io.

Spring DATA

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

Фреймворк позволяет облегчить использование технологий доступа к данным, реляционных и не реляционных баз данных, облачных баз данных. Spring DATA — базовый проект, который включает множество других подпроектов, которые работают с конкретными базами данных.

Общий раздел Spring Data JPA

Java Persistence API (JPA)

Спецификация JPA 2.1 была выпущена 22 апреля 2013 года. Входит в J2EE и является стандартом доступа к данным в JAVA. Поддерживает большинство популярных поставщиков службы постоянства, например Hibernate.

Описание и основные возможности JPA
  • JPA — пример приложения Hello World. Настройка использования Spring + JPA + Hibernate. Часть 1 — Описание стандарта Java Persistence API (JPA)
  • JPA — пример приложения Hello World. Настройка использования Spring + JPA + Hibernate. Часть 2
Создание запросов в JPA, использование Java Persistence Query Language (JPQL)
  • JPA — создание нетипизированных запросов и запросов со специальным типом
  • JPA – операции INSERT, UPDATE, DELETE. Примеры запросов вставки, удаления, обновления на JPQL
  • JPA – создание собственного запроса на чистом SQL
Создание запросов с использованием API-интерфейса критериев JPA 2

Spring DATA JPA

Базовые настройки для запуска приложения с использованием Spring Data JPA
Аудит изменений в классе сущности в Spring Data JPA
Spring Data JPA + Hibernate Envers
Вопросы для прохождения интервью на позицию Java разработчик
  • Собеседование по Java EE — Spring Framework (вопросы и ответы). Часть 1
  • Собеседование по Java EE — Spring Framework (вопросы и ответы). Часть 2

Объектно-реляционное отображение с помощью JPA Hibernate и Spring Data JPA Персистентность с помощью Spring Data JPA

В этом разделе мы напишем приложение Spring Data JPA, которое сохраняет запись в базе данных и затем извлекает ее. Для этого добавим зависимости Spring со стороны конфигурации Apache Maven.

Листинг 9. Зависимости Maven от Spring

image (2).png

Модуль spring-data-jpa обеспечивает поддержку репозитория для JPA и содержит транзитивные зависимости от других модулей, которые нам понадобятся, например spring-core и spring-context.

Кроме того, нам нужна зависимость spring-test для запуска тестов с помощью расширения Spring.

Стандартный файл конфигурации для Spring Data JPA — это Java класс для создания и настройки бинов, необходимых для Spring Data. Конфигурацию можно сделать с помощью XML файла или Java кода. Мы используем второй вариант. Создадим следующий файл конфигурации для персистентного приложения:

Листинг 10. Класс SpringDataConfiguration

image (2).png

image (2).png

  • Аннотация @EnableJpaRepositories будет сканировать класс конфигурации для репозиториев Spring Data #1.
  • Создаем бин источника данных #2 и указываем свойства JDBC — драйвер #3, URL базы данных #4, имя пользователя #5 и пароль #6 для доступа.
  • Далее создаем бин диспетчера транзакций на основе фабрики диспетчеров классов-сущностей #7. Каждое взаимодействие с базой данных должно происходить в пределах транзакции, и поэтому для Spring Data нужен бин диспетчера транзакций.
  • Создаем бин адаптера вендора JPA, который необходим для JPA, чтобы взаимодействовать с Hibernate #8. Настраиваем этот адаптер вендора для доступа к базе данных MySQL #9.
  • Мы создаем объект, принадлежащий классу LocalContainerEntityManagerFactoryBean – это бин, который производит EntityManagerFactory в соответствии со контрактом начальной загрузки стандартного контейнера JPA #10.
  • Настраиваем источник данных #11, адаптер вендора #12 и пакеты сканирования для классов сущностей #13. As the Item entity is located in cscs23.orm, we set this package to be scanned.
  • Spring Data JPA обеспечивает поддержку для уровней доступа к данным на основе JPA за счет уменьшения объема стандартного кода и создания реализаций для интерфейсов репозитория. Нам нужно только определить интерфейс нашего собственного репозитория для расширения интерфейсов Spring Data.

Листинг 11. Интерфейс ItemRepository

Интерфейс ItemRepository расширяет CrudRepository. Это репозиторий сущностей Item с идентификатором Long. Помните, что класс Item имеет поле id с аннотацией @Id of type Long. Мы можем напрямую вызывать методы save, findAll или findById, унаследованные из CrudRepository, и можем использовать их без дополнительной информации для выполнения операций с базой данных.

Для дополнительных операций можно использовать интерфейс JpaRepository, который, в свою очередь, расширяет интерфейс CrudRepository. Он идет с дополнительными методами, включая в данном случае методы, которые позволяют выполнять разбиение на страницы, сортировку или пакетные операции.

Spring Data JPA использует шаблон proxy для поддержки механизма взаимодействия с базой данных. Целью proxy является замена другого объекта. Spring Data JPA создаст класс proxy, реализующий интерфейс ItemRepository, а также создаст его методы (рис. 1). Этот класс proxy будет определять все методы, унаследованные от CrudRepository, в том числе save, findAll или findById. Программисту больше не придется тратить время на написание логики этих методов — их реализация осуществляется со стороны Spring Data JPA. Это работает в духе фреймфорков и, в частности, Spring — происходит инверсия контроля, рабочий поток уже включен, обеспечиваются точки перехвата, которые программист должен заполнить, сосредоточившись на бизнес-логике.

Сохраняем запись Item в базу данных, используя Spring Data JPA.

image (2).png

Листинг 12. Класс ItemSpringDataJPATest

  • Расширяем тест, используя SpringExtension #1. Это расширение используется для интеграции контекста тестирования Spring с тестированием JUnit 5 Jupiter.
  • Контекст тестирования Spring настраивается с помощью бинов, определенных в ранее представленном классе SpringDataConfiguration #2.
  • Бин ItemRepository внедряется с помощью Spring через auto-wiring #3. Это возможно, поскольку пакет cscs23.orm.repositories, в котором находится ItemRepository, используется в качестве аргумента аннотации @EnableJpaRepositories в листинге 10.
  • Если мы хотим проверить и вызвать itemRepository.getClass(), то увидим, что это что-то вроде com.sun.proxy.$Proxy41 – proxy, сгенерированный Spring Data JPA, как показано на Рис. 1.
  • Создаем новый экземпляр класса Item и устанавливаем его свойство info #4.
  • Сохраняем объект item #5. Метод save унаследован от интерфейса CrudRepository, и его тело будет сгенерировано Spring Data JPA при создании класса proxy. Он просто сохранить сущность Item в базу данных.
  • Мы опять имеет все преимущества работы с JPA или Hibernate: нет кода SQL и не нужен JDBC; нет операций CRUD внутри кода Java, только классы, объекты и методы; переносимость на каждый диалект SQL обеспечивается ORM.
  • Кроме того, тест Spring Data JPA намного короче, чем тесты с использованием интерфейса JPA или Hibernate. Это возможно потому, что стандартный код был удален и больше нет необходимости явного создания объектов или явного контроля транзакции. Благодаря внедрению объекта из репозитория генерируются методы класса proxy. Основная нагрузка теперь на стороне конфигурации, но ее необходимо делать только один раз для каждого приложения.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *