Короткий ответ
JPA (Java Persistence API) — это стандарт (спецификация) ORM в Java: он определяет API и набор аннотаций — @Entity, EntityManager, JPQL — но сам по себе реализацией не является. Hibernate — самая популярная реализация этой спецификации: он реализует интерфейсы JPA и добавляет собственные расширения: HQL, тонкую настройку кэша второго уровня и дополнительные возможности.
Как это работает подробнее
Разница в уровне абстракции: JPA — это правила и интерфейсы, у которых есть несколько реализаций, а Hibernate — одна из них, наиболее функциональная. Если писать код только на стандартном JPA-API, он будет переносимым между ORM-провайдерами; расширенные же возможности доступны через Hibernate.
- JPA — стандарт: набор правил, интерфейсов и аннотаций; реализации — Hibernate, EclipseLink, OpenJPA.
- Hibernate — реализация JPA с самым широким набором возможностей и расширений.
- HQL — собственный язык запросов Hibernate, работающий на высоком уровне абстракции.
- На практике: в Spring Boot по умолчанию JPA-провайдером является Hibernate — код пишется через JPA-API, а Hibernate работает под капотом.
Пример кода
JpaDemo.java
// код написан против стандартного JPA API;
// реализацию (обычно Hibernate) подставляет провайдер
EntityManagerFactory emf = Persistence.createEntityManagerFactory("demo-unit");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
em.persist(employee);
em.getTransaction().commit();
em.close();Что использовать на практике
- Пишите код на стандартном JPA-API — он останется переносимым между провайдерами.
- Расширения Hibernate (HQL, собственные аннотации, настройка кэша) подключайте, когда стандартных средств JPA не хватает.
- В Spring Boot по умолчанию уже работает связка «JPA-API поверх Hibernate» — меняйте её только осознанно.
Подводные камни
- Частая ошибка — путать спецификацию и реализацию: JPA сама ничего не выполняет, всегда нужен провайдер.
- Использование Hibernate-специфичных классов (Session, собственные аннотации) привязывает код к Hibernate.
- Переносимость не абсолютна: отдельные возможности JPA разные провайдеры реализуют по-разному.
Как отвечать на собеседовании
- Дайте определение JPA как стандарта (спецификации) → назовите Hibernate реализацией этого стандарта → перечислите другие реализации: EclipseLink, OpenJPA → покажите, что код на JPA переносим между провайдерами → перечислите расширения Hibernate: HQL, настройка кэша → добавьте факт, что в Spring Boot провайдером по умолчанию является Hibernate.