В чём разница между использованием JPA и нативного API Hibernate?

«В чём разница между использованием JPA и нативного API Hibernate?» — вопрос из категории Hibernate, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

JPA (Java Persistence API) — это стандартная спецификация, а Hibernate — её самая популярная реализация. Работать можно на любом уровне.

Сравнение подходов:

Критерий JPA (Стандарт) Нативный Hibernate API
Портативность Высокая. Код будет работать с любой JPA-реализацией (EclipseLink, OpenJPA). Низкая. Код привязан к Hibernate.
Функциональность Базовая, стандартизированная. Расширенная. Предоставляет возможности, отсутствующие в стандарте JPA.
Пример кода EntityManager, @Entity, JPQL. Session, Criteria, HQL, собственный кэш.

Когда что использовать:

  • Используйте JPA: Для нового кода, где важна переносимость и долгосрочная поддержка.
  • Можно использовать Hibernate API: Когда необходима специфическая функциональность Hibernate, отсутствующая в JPA, и вы уверены, что не будете менять провайдера.

Пример смешанного использования (чаще всего):

// Основная работа через JPA-интерфейс (EntityManager)
@Entity
public class Product { /* JPA-аннотации */ }

@PersistenceContext
private EntityManager em; // Стандартный JPA

// В особых случаях - получение нативной сессии Hibernate
Session session = em.unwrap(Session.class);
// Использование Hibernate-specific features
NaturalIdLoadAccess<Product> naturalIdLoader = session.byNaturalId(Product.class);

Best practice: Пишите основную логику, придерживаясь стандарта JPA, и используйте нативные возможности Hibernate только там, где это критически необходимо.