Объектно-реляционное отображение (ORM)
ORM (Object-Relational Mapping) – технология, которая связывает объекты в языке программирования с таблицами базы данных. Данные из таблиц автоматически преобразуются в объекты, и наоборот, изменения в объектах могут сохраняться в таблицу.
Цель ORM – избавить разработчика от рутины написания SQL для часто выполняемых операций CRUD (создание, чтение, обновление, удаление). Работа идёт с объектами, а фреймворк сам генерирует нужные SQL-запросы.
Класс Java (Entity) соответствуют таблице в базе, его экземпляры – строкам таблицы. Поля класса обычно отображаются на колонки таблицы.
ORM обеспечивает абстракцию над конкретной СУБД: разработчик пишет код на Java, а ORM-провайдер адаптирует SQL под конкретный диалект базы (напр. отличия в синтаксисе между MySQL и Oracle), позволяя более легко сменить СУБД при необходимости.
Пояснение
Идея ORM заключается в том, чтобы устранить "импедансное несоответствие" между объектным миром (объекты, классы, наследование) и реляционным миром (таблицы, строки, связи через внешние ключи). Без ORM разработчик вынужден постоянно:
Писать SQL-запросы для выборки данных.
Разбирать ResultSet, вручную присваивая значения полям объектов.
Составлять SQL для вставки/обновления на основе полей объекта.
Следить за соответствием типов Java и SQL (например, java.time.LocalDate -> DATE, etc.).
Управлять транзакциями на более низком уровне.
ORM-фреймворк берет эти задачи на себя. Вы описываете модель данных в виде классов Java (называемых сущностями, entities), отмечая специальные моменты аннотациями (что является первичным ключом, как называются колонки, какие классы связаны отношениями 1:N, M:N и т.д.). Далее фреймворк:
Сопоставляет (мапит) классы к таблицам и строит SQL для создания/чтения/обновления.
Предоставляет API для базовых операций: сохранить объект (save), получить по идентификатору (find/getById), удалить (delete), выборка по критериям и пр.
Следит за контекстомPersistence Context/Session – грубо говоря, кэш уже загруженных объектов, чтобы не загружать повторно, и чтобы обеспечить связь между объектами (например, при обращении order.getCustomer() ORM может либо вернуть уже загруженный объект Customer, либо автоматически подгрузить его из БД).
В Java стандарт ORM – это JPA (Java Persistence API), о ней далее. ORM значительно ускоряет разработку типичных приложений, где много таблиц и однообразных операций. Однако ORM не означает полное отсутствие SQL: разработчик может выполнять сложные выборки с помощью специальных языков запросов (в JPA это JPQL/HQL) или нативных SQL при необходимости. Также требуется понимание, что делает фреймворк под капотом, чтобы избежать неэффективных запросов (проблемы N+1 запросов, неоптимальной загрузки связей и т.д.). В целом, изучение ORM дает мощный инструмент управления данными на уровне объектов.
