JPA, Hibernate и ORM

ORM

Object-relational mapping сопоставляет две модели:

Объектная модельРеляционная модель
класстаблица
объектстрока
полестолбец
ссылка на объектвнешний ключ
коллекциясвязь через внешний ключ или промежуточную таблицу

Это не механическое совпадение. Наследование, граф объектов, порядок коллекций и идентичность представлены в Java и SQL по-разному. Правила такого преобразования и называются маппингом.

Где здесь JPA и Hibernate

  • Jakarta Persistence (JPA) — стандарт API и аннотаций.
  • Hibernate ORM — реализация JPA и собственный API.
  • Spring Data JPA — слой репозиториев поверх JPA.
  • JDBC — интерфейс выполнения SQL через драйвер.

В старом коде пакеты называются javax.persistence.*, в современных версиях — jakarta.persistence.*. Модель работы при переезде пакетов не изменилась.

Минимальная сущность

@Entity
@Table(name = "book")
public class Book {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
 
    @Column(nullable = false)
    private String title;
 
    protected Book() {
        // нужен провайдеру
    }
}

Сущность должна иметь идентификатор и конструктор без аргументов с доступностью не строже protected. Финальные классы и методы мешают прокси и ленивой загрузке, поэтому их обычно избегают.

Когда ORM полезен

  • много обычных операций над агрегатами;
  • важны dirty checking и единая модель транзакций;
  • связи удобно обходить как граф;
  • SQL не является центром бизнес-операции.

Для отчётов, массовых обновлений и сложной аналитики прямой SQL или проекции часто проще и предсказуемее. См. SQL запросы VS Hibernate.

Вопросы для повторения

  1. ORM устраняет несовпадение моделей? Нет, он задаёт правила преобразования и скрывает часть служебного кода.
  2. Можно ли заменить Hibernate другим провайдером? В пределах стандартного JPA API — обычно да, но расширения и детали SQL могут привязать код к реализации.
  3. Spring Data JPA сам является ORM? Нет, он строит репозитории поверх JPA-провайдера.
  4. Почему у сущности нужен идентификатор? Persistence context связывает Java-объект с конкретной строкой по типу и ключу.

Связано: Hibernate, Маппинг Hibernate, Основные аннотации Hibernate, JDBC.