Короткий ответ
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 не хватает.