Java Persistence API – это стандартная технология, позволяющая "отображать" объекты на реляционные базы данных. POM-модель spring-boot-starter-data-jpa позволяет быстро начать работу. Она обеспечивает следующие ключевые зависимости:
-
Hibernate одна из самых популярных реализаций JPA.
-
Spring Data JPA: помогает реализовать репозитории на основе JPA.
-
Spring ORM: основное средство поддержки ORM из Spring Framework.
Традиционно классы "сущностей" JPA задаются в файле persistence.xml. В Spring Boot этот файл не требуется, вместо него используется сканирование сущностей (Entity Scanning). По умолчанию поиск выполняется во всех пакетах, расположенных ниже основного конфигурационного класса (того, который аннотирован @EnableAutoConfiguration или @SpringBootApplication).
Учитываются любые классы, аннотированные @Entity, @Embeddable или @MappedSuperclass. Типичный класс сущностей похож на следующий пример:
@Entity public class City implements Serializable { @Id @GeneratedValue private Long id; @Column(nullable = false) private String name; @Column(nullable = false) private String state; // ... дополнительные члены, часто содержащие отображения аннотации @OneToMany protected City() { // конструктор без аргументов, требуемый спецификацией JPA // protected, поскольку не предназначен для использования напрямую } public City(String name, String state) { this.name = name; this.state = state; } public String getName() { return this.name; } public String getState() { return this.state; } // ... и т.д. }
@Entity class City : Serializable { @Id @GeneratedValue private val id: Long? = null @Column(nullable = false) var name: String? = null private set // ... и т.д. @Column(nullable = false) var state: String? = null private set // ... дополнительные члены, часто содержащие отображения аннотации @OneToMany protected constructor() { // конструктор без аргументов, требуемый спецификацией JPA // protected, поскольку не предназначен для использования напрямую } constructor(name: String?, state: String?) { this.name = name this.state = state } }
@EntityScan.
Репозитории Spring Data JPA
Репозитории Spring Data JPA – это интерфейсы, которые можно определять для получения доступа к данным. JPA-запросы создаются автоматически на основе имен методов. Например, интерфейс CityRepository может объявить метод findAllByState(String state) для поиска всех городов в данном штате.
В случае более сложных запросов можно аннотировать метод с помощью аннотации Query из Spring Data.
Репозитории Spring Data обычно расширяются за счет интерфейсов Repository или CrudRepository. Если вы используете автоконфигурацию, поиск в репозиториях ведется от пакета, содержащего основной конфигурационный класс (тот, который аннотирован @EnableAutoConfiguration или @SpringBootApplication), и вниз по иерархии.
В следующем примере показано типичное определение интерфейса взаимодействия с репозиторием Spring Data:
public interface CityRepository extends Repository<City, Long> { Page<City> findAll(Pageable pageable); City findByNameAndStateAllIgnoringCase(String name, String state); }
interface CityRepository : Repository<City?, Long?> { fun findAll(pageable: Pageable?): Page<City?>? fun findByNameAndStateAllIgnoringCase(name: String?, state: String?): City? }
Репозитории Spring Data JPA поддерживают три различных режима начальной загрузки: по умолчанию, с задержкой и отложенная. Чтобы активировать загрузку с задержкой или отложенную загрузку, установите свойство spring.data.jpa.repositories.bootstrap-mode в значение deferred или lazy соответственно. При отложенной загрузке или загрузке с задержкой, автоконфигурируемый EntityManagerFactoryBuilder будет использовать AsyncTaskExecutor контекста, если таковой имеется, в качестве исполнителя загрузки. Если существует более одного исполнителя, будет использоваться тот, который назван applicationTaskExecutor.
При загрузке с задержкой или отложенной загрузке следует убедиться, что доступ к инфраструктуре JPA предоставляется с задержкой после этапа начальной загрузки контекста приложения. Можно использовать SmartInitializingSingleton для вызова любой инициализации, которой требуется инфраструктура JPA. Для компонентов JPA (таких как конвертеры), которые создаются в виде бинов Spring, используйте ObjectProvider, чтобы отсрочить разрешение зависимостей, если таковые имеются.
Репозитории Spring Data Envers
Если доступен Spring Data Envers, JPA-репозитории будут автоматически конфигурироваться для обеспечения поддержки типичных Envers-запросов.
Чтобы использовать Spring Data Envers, убедитесь, что репозиторий расширяется из RevisionRepository, как показано в следующем примере:
public interface CountryRepository extends RevisionRepository<Country, Long, Integer>, Repository<Country, Long> { Page<Country> findAll(Pageable pageable); }
interface CountryRepository : RevisionRepository<Country?, Long?, Int>, Repository<Country?, Long?> { fun findAll(pageable: Pageable?): Page<Country?>? }
Создание и удаление баз данных JPA
По умолчанию базы данных JPA создаются автоматически, только если вы используете встроенную базу данных (H2, HSQL или Derby). Можно явным образом сконфигурировать параметры JPA с помощью свойств spring.jpa.*. Например, для создания и удаления таблиц можно добавить следующую строку в application.properties:
spring.jpa.hibernate.ddl-auto=create-drop
spring:
jpa:
hibernate.ddl-auto: "create-drop"
hibernate.hbm2ddl.auto. Можете установить его наряду с другими нативными свойствами Hibernate, используя
spring.jpa.properties.* (префикс удаляется перед добавлением в диспетчер сущностей). В следующей строке показан пример установки свойств JPA для Hibernate:
spring.jpa.properties.hibernate[globally_quoted_identifiers]=true
spring:
jpa:
properties:
hibernate:
"globally_quoted_identifiers": "true"
Строка в предыдущем примере передает значение true для свойства hibernate.globally_quoted_identifiers диспетчеру сущностей Hibernate.
По умолчанию DDL-выполнение (или валидация) откладывается до запуска ApplicationContext. Существует также флаг spring.jpa.generate-ddl, но он не используется, если активна автоконфигурация Hibernate, поскольку настройки ddl-auto более точные.
Открытие EntityManager в представлении
Если вы запускаете веб-приложение, Spring Boot по умолчанию регистрирует OpenEntityManagerInViewInterceptor для применения шаблона открытия EntityManager в представлении (Open EntityManager in View), чтобы обеспечить возможность отложенной загрузки в веб-представлениях. Если вам не требуется такая логика работы, то следует установить spring.jpa.open-in-view в false в application.properties.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ