Маппинг Hibernate
Маппинг отвечает на вопрос: как объектная модель представлена таблицами, столбцами, ключами и связями.
Карта раздела
- основы: Основные аннотации Hibernate, Аннотация Access, Аннотация Basic, Аннотация Column;
- идентификаторы: Аннотация GeneratedValue, Генерация первичных ключей Hibernate, Как смапить составной ключ;
- значения: Маппинг Enum, Маппинг даты до Java 8 и старше, Аннотация Transient;
- составные значения: Встраиваемый класс Embeddable, Сохранение коллекций базовых типов Hibernate;
- связи: Связи таблиц, JoinColumn JoinTable, Fetch type Hibernate;
- наследование: Cтратегии маппинга иерархии наследования Inheritance Mapping Strategies в JPA.
Проверка хорошего маппинга
- Владеющая сторона связи определена явно.
equalsиhashCodeне зависят от ленивых коллекций и изменяемых полей.- Каскады отражают жизненный цикл агрегата, а не используются «на всякий случай».
- Fetch-план выбирается для конкретного сценария.
- Ограничения Java-модели согласованы с
NOT NULL,UNIQUEи внешними ключами БД. - Миграции схемы остаются источником истины для production.
Вопросы для повторения
- Кто владеет двунаправленной связью? Сторона, на которой задан внешний ключ; в JPA обратная сторона указывает
mappedBy. - Аннотации достаточно для целостности? Нет, критичные ограничения должны существовать и в БД.
- Почему нельзя сделать все связи EAGER? Это создаёт тяжёлые графы, лишние join и непредсказуемую стоимость.
- Что важнее — удобная модель или схема? Нужен осознанный компромисс: ORM не отменяет ограничения реляционной модели.