Вопрос проверяет понимание ORM-подхода и различие между спецификацией и её реализацией.
JPA — это спецификация, описывающая, как работать с ORM в Java. Hibernate — это конкретная реализация этой спецификации. JPA задаёт интерфейсы и правила, а Hibernate реализует их и добавляет свои возможности. Код, написанный под JPA, более переносим между реализациями. Hibernate можно использовать как JPA-провайдер.
Этот вопрос часто задают, чтобы понять, насколько кандидат отделяет стандарт от конкретной технологии.
JPA (Java Persistence API) — это стандарт, который описывает API для работы с объектно-реляционным отображением.
Hibernate — это ORM-фреймворк, реализующий JPA и расширяющий его дополнительными возможностями.
Важно сразу разделить роли.
JPA
Спецификация
Интерфейсы и аннотации
Контракт поведения
Hibernate
Конкретная реализация
Реальный код выполнения
Дополнительные расширения
Переносимость
JPA-код можно запускать с разными провайдерами
Hibernate API жёстко привязывает к Hibernate
Расширения
Hibernate имеет собственные аннотации
Например, @Type, @Formula
Настройки
JPA задаёт базовые параметры
Hibernate предлагает тонкую настройку
Обычно:
В коде используют JPA API
В качестве провайдера выбирают Hibernate
Hibernate-специфичные вещи применяют осознанно
JPA — это контракт и стандарт, Hibernate — его реализация с дополнительными возможностями. Предпочтительно писать код под JPA, чтобы снизить связанность.