JpaRepository

Тема дорожной карты · Spring Boot

Репозитории Spring Data JPA — это интерфейсы в Spring Data JPA, предоставляющие полную абстракцию доступа к данным поверх Hibernate и JPA, позволяя разработчикам взаимодействовать с реляционной базой данных в Spring Boot-приложении без написания шаблонного кода DAO. Расширяя JpaRepository<Entity, ID>, репозиторий Spring Data JPA наследует методы save(), findById(), findAll(), count(), deleteById() и методы пагинации/сортировки из PagingAndSortingRepository и CrudRepository. Пользовательские методы запросов автоматически выводятся Spring Data JPA из сигнатуры метода (например, findByLastNameAndActiveTrue(String lastName)) или пишутся явно на JPQL через @Query("SELECT u FROM User u WHERE u.email = :email") — нативный SQL также поддерживается через nativeQuery = true. Репозитории Spring Data JPA инстанцируются при запуске как управляемые Spring бины: аннотация @Repository на интерфейсе не обязательна, хотя @Repository на реализующих классах включает трансляцию исключений Spring из JPA-исключений в DataAccessException. Для сложных запросов проекции (interface UserSummary { String getName(); }), Specification<T> с JPA Criteria API и аннотации @EntityGraph расширяют возможности репозиториев Spring Data JPA за пределы того, что простое именование методов может выразить.

Как это работает

JpaRepository: 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, хуже для сложной аналитики.

Типичные ошибки

Ловушки JpaRepository: 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).

Связанные понятия

Полезные ресурсы