Gymterview
junior

Что такое JPA и как Hibernate связан с JPA?

JPA (Jakarta Persistence API, ранее Java Persistence API) — спецификация Java, определяющая стандартный API для объектно-реляционного маппинга и управления персистентными данными. JPA — это набор интерфейсов и аннотаций, а не реализация.

Hibernate — наиболее популярная реализация JPA. Помимо Hibernate, существуют другие реализации: EclipseLink, OpenJPA.

Соотношение JPA и Hibernate

Пример
JPA (спецификация)     →  Hibernate (реализация)
EntityManager          →  Session (extends EntityManager)
EntityManagerFactory   →  SessionFactory (extends EntityManagerFactory)
JPQL                   →  HQL (расширение JPQL)
@Entity, @Table, @Id   →  аннотации JPA + собственные (@NaturalId, @BatchSize...)
persistence.xml        →  hibernate.cfg.xml (или Spring Boot auto-config)
Пример: JPA API vs Hibernate API
// JPA API (стандартный, переносимый)
@PersistenceContext
private EntityManager entityManager;

public User findById(Long id) {
    return entityManager.find(User.class, id);
}

public List<User> findByName(String name) {
    return entityManager.createQuery(
            "SELECT u FROM User u WHERE u.name = :name", User.class)
        .setParameter("name", name)
        .getResultList();
}

// Hibernate API (расширенный)
Session session = entityManager.unwrap(Session.class);

// NaturalId — Hibernate-специфичная функция
User user = session.byNaturalId(User.class)
    .using("email", "john@example.com")
    .load();

// Hibernate-специфичные аннотации
@Entity
public class User {
    @NaturalId
    private String email;       // натуральный ключ — только Hibernate

    @BatchSize(size = 25)       // оптимизация загрузки — только Hibernate
    @OneToMany(mappedBy = "user")
    private List<Order> orders;
}

Важное

  • JPA — спецификация (интерфейсы), Hibernate — реализация
  • Используя только JPA API, можно заменить Hibernate на другую реализацию без изменения кода
  • Hibernate расширяет JPA собственными аннотациями и API (@NaturalId, @BatchSize, @Formula, Session)
  • В Spring Boot по умолчанию используется Hibernate как JPA-провайдер

Частые ошибки

  • Путать JPA и Hibernate — JPA не умеет ничего делать сам, это только набор интерфейсов
  • Использовать Hibernate-специфичный API без необходимости — теряется переносимость; начинайте с JPA API
  • Не знать, что происходит «под капотом» — Spring Data JPA → JPA → Hibernate → JDBC → SQL; понимание всех уровней необходимо для отладки

Как используется в 2026

  • JPA 3.1+ (Jakarta) — актуальная версия спецификации, входит в Jakarta EE 10
  • Hibernate 6.x — реализация JPA 3.1, значительные внутренние изменения по сравнению с 5.x
  • Spring Data JPA абстрагирует от JPA/Hibernate ещё сильнее, но знание JPA необходимо для оптимизации
  • Миграция с javax.persistence на jakarta.persistence — обязательна при переходе на Spring Boot 3.x

На собеседовании: ключевой момент — JPA это спецификация (интерфейсы и аннотации), а Hibernate — реализация. Покажите, что знаете стек вызовов: Spring Data JPA → JPA → Hibernate → JDBC → SQL. Если спросят, зачем нужен JPA при наличии Hibernate — ответ в переносимости и стандартизации.