В чем разница между JPA, Hibernate и Spring Data JPA и как они связаны
Что проверяют
Различаете ли вы спецификацию, реализацию и надстройку. Путаница здесь очень частая.
Как отвечать
Три уровня, вложенные друг в друга:
- JPA это спецификация (сейчас Jakarta Persistence): набор интерфейсов и аннотаций (
@Entity,@Id,EntityManager, JPQL). Сама по себе она ничего не делает, это контракт; - Hibernate это реализация спецификации, самая распространённая. Кроме стандартных возможностей у неё есть свои: кэш второго уровня,
@BatchSize, критерии, специфичные типы, HQL, расширенные стратегии генерации ключей; - Spring Data JPA это надстройка над JPA: генерирует реализации репозиториев по интерфейсам, разбирает имена методов в запросы (
findByCompanyAndIsActiveTrue), даёт пагинацию,@Query, проекции и спецификации.
public interface JobRepository extends JpaRepository<Job, UUID> {
List<Job> findByCompanyIgnoreCase(String company); // реализация генерируется
}Как это работает вместе: Spring Data вызывает EntityManager из JPA, а его предоставляет Hibernate. Заменить Hibernate на другую реализацию теоретически можно, если не использовать её специфику, на практике почти никто этого не делает.
Что стоит добавить: Spring Data скрывает EntityManager, но не отменяет знания о нём. Проблема N+1, ленивая загрузка вне сессии, отслеживание изменений и сброс контекста персистентности остаются, и разбираться в них приходится на уровне Hibernate.
Где спотыкаются
Называют Hibernate спецификацией, а JPA библиотекой.
Считают Spring Data JPA заменой Hibernate.
Не знают, что JpaRepository это уже надстройка, а не часть JPA.
Уверены, что Spring Data избавляет от N+1.