Spring Data JPA
Тема дорожной карты · Spring Boot
Spring Data JPA — это модуль семейства Spring Data, который наслаивает абстракции репозиториев и вывод запросов поверх JPA (Java Persistence API) и Hibernate, значительно сокращая объём шаблонного кода для операций с базами данных в Spring Boot-приложениях. Расширяя JpaRepository<Entity, ID> или CrudRepository<Entity, ID>, разработчик автоматически получает методы save(), findById(), findAll(), deleteById() и методы пагинации без написания какого-либо SQL. Spring Data JPA выводит SQL-запросы из имён методов репозитория, например findByEmailAndActiveTrue(String email), и поддерживает пользовательский JPQL или нативный SQL через аннотацию @Query. Модуль интегрируется с авто-конфигурацией Spring Boot: при наличии spring-boot-starter-data-jpa Spring Boot настраивает LocalContainerEntityManagerFactoryBean, JpaTransactionManager и пул соединений HikariCP, используя свойства из spring.datasource.* и spring.jpa.*. Spring Data JPA тесно взаимодействует с @DataJpaTest, Testcontainers и генерацией схемы Hibernate (spring.jpa.hibernate.ddl-auto), обеспечивая полноценный уровень персистентности для Spring Boot-приложений.
Как это работает
Spring Data JPA: Spring Data JPA оборачивает Hibernate (JPA-реализация). @Entity маппит Java-класс → DB-таблица; JpaRepository<T, ID> даёт CRUD + paging + sorting бесплатно. Method names типа findByEmailAndStatus парсятся в queries; сложные queries — @Query (JPQL или native SQL). Relations: @OneToMany, @ManyToOne, @ManyToMany — дефолтный fetch LAZY (one-to-many) или EAGER (many-to-one); знаменитая N+1 проблема прячется здесь. @Transactional оборачивает service-методы в DB-транзакцию.
Когда применять
Все relations LAZY по дефолту + JOIN FETCH или entity graphs для eager-загрузки только когда надо. Projections (DTO/interface) для read-only endpoints — пропускают Hibernate entity overhead. Мониторьте N+1 (Hibernate stats, p6spy или Datasource Proxy в тестах). Для heavy-read — raw JdbcTemplate или jOOQ — JPA отличен для CRUD, хуже для сложной аналитики.
Типичные ошибки
Ловушки Spring Data JPA: N+1 queries (lazy loading в цикле); EAGER на каждом relation (огромные cascading joins); @Transactional на private/self-invocation (proxy не intercept-ит — аннотация ничего не делает); auto-DDL (spring.jpa.hibernate.ddl-auto=update) в prod (тихий + опасный schema drift).