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.
Вопросы для повторения
- ORM устраняет несовпадение моделей? Нет, он задаёт правила преобразования и скрывает часть служебного кода.
- Можно ли заменить Hibernate другим провайдером? В пределах стандартного JPA API — обычно да, но расширения и детали SQL могут привязать код к реализации.
- Spring Data JPA сам является ORM? Нет, он строит репозитории поверх JPA-провайдера.
- Почему у сущности нужен идентификатор? Persistence context связывает Java-объект с конкретной строкой по типу и ключу.
Связано: Hibernate, Маппинг Hibernate, Основные аннотации Hibernate, JDBC.