Оглавление
Hibernate
Работа с базой данных через объекты: сущности, связи, запросы JPQL и Criteria, транзакции.
1.Начало работы
- Что такое HibernateЧто такое ORM, как связаны стандарт Jakarta Persistence и Hibernate, какие версии использует курс и где Hibernate встречается в Spring Boot.
- Настройка проектаСоздание Maven-проекта, подключение Hibernate и H2 в pom.xml, настройка подключения в persistence.xml или в коде и первый запуск.
- Первая сущностьКак превратить Java-класс в таблицу: аннотации @Entity, @Id и @GeneratedValue, требования к классу-сущности и его регистрация в persistence.xml.
- EntityManager и контекст персистентностиЧто такое EntityManagerFactory и EntityManager, как контекст персистентности отслеживает объекты, почему изменения сохраняются без вызова save и как Session связан с EntityManager.
- Создание, чтение, изменение, удалениеЧетыре базовые операции с сущностями: persist, find, изменение управляемого объекта, merge для объектов извне и remove.
- Состояния сущностиЧетыре состояния объекта-сущности — новый, управляемый, отсоединённый и удалённый, — как объект переходит между ними и почему это важно.
2.Отображение сущностей
- Столбцы и типыНастройка таблиц и столбцов через @Table и @Column, соответствие типов Java и SQL, хранение перечислений через @Enumerated и дат, исключение полей через @Transient.
- Встраиваемые типыОбъединение нескольких столбцов в объект-значение через @Embeddable и @Embedded, запись в роли встраиваемого типа и переименование столбцов через @AttributeOverride.
- ИдентификаторыСтратегии генерации первичного ключа — SEQUENCE, IDENTITY и UUID, что означает allocationSize и натуральные идентификаторы через @NaturalId.
- НаследованиеКак хранить иерархию классов в таблицах: стратегии SINGLE_TABLE, JOINED и TABLE_PER_CLASS, полиморфные запросы и общие поля в @MappedSuperclass.
- ВалидацияПроверка полей сущности аннотациями Jakarta Validation: @NotBlank, @Size, @Email, автоматическая проверка перед сохранением и ручная проверка через Validator.
3.Связи между сущностями
- Многие к одному и один ко многимСвязь комментариев со статьёй через @ManyToOne и @JoinColumn, обратная сторона через @OneToMany(mappedBy) и синхронизация обеих сторон вспомогательным методом.
- Один к одномуСвязь автора с профилем через @OneToOne: уникальный внешний ключ на владеющей стороне, mappedBy на другой стороне и общий первичный ключ через @MapsId.
- Многие ко многимСвязь статей и тегов через @ManyToMany и промежуточную таблицу @JoinTable, вспомогательные методы для обеих сторон, запрос через связь и удаление связей.
- Каскады и удаление сиротСохранение и удаление статьи вместе с комментариями через cascade, значения CascadeType и удаление убранных из списка комментариев через orphanRemoval.
- Ленивая и жадная загрузкаКогда Hibernate загружает связанные сущности: FetchType.LAZY и EAGER, значения по умолчанию для каждого типа связи, прокси-объекты и LazyInitializationException.
- Проблема N+1Почему список статей с авторами превращается в десятки запросов, и три способа это исправить: join fetch, графы сущностей и пакетная загрузка.
4.Запросы
- Запросы JPQLЯзык запросов Jakarta Persistence: выборка сущностей через createQuery, условия и именованные параметры, сортировка, getResultList, getSingleResult и getSingleResultOrNull.
- Соединения, проекции и массовые измененияJPQL дальше: соединения через связи, выборка отдельных полей, группировка с count и sum, заполнение записей через select new и запросы update и delete через executeUpdate.
- Criteria APIПостроение запросов из Java-объектов через CriteriaBuilder: динамические фильтры поиска, предикаты, сортировка и типобезопасная статическая метамодель от hibernate-processor.
- Нативный SQLВыполнение обычного SQL через Hibernate методом createNativeQuery: загрузка сущностей, чтение строк массивами Object, заполнение записей и параметры.
- Постраничный выводРазбиение результатов запроса на страницы через setFirstResult и setMaxResults, подсчёт страниц и как пагинация работает вместе с join fetch.
5.В рабочем проекте
- Транзакции и сброс измененийКак начинать, фиксировать и откатывать локальную транзакцию, когда Hibernate сбрасывает изменения в базу, автоматический сброс перед запросами и явный em.flush().
- Оптимистическая блокировкаЗащита от потерянных изменений полем @Version: как работает проверка версии в UPDATE, OptimisticLockException и обработка правок, пришедших из формы.
- Генерация схемы и миграцииПочему drop-and-create годится только для учёбы, значения hibernate.hbm2ddl.auto, генерация DDL-скрипта, миграции Flyway и проверка схемы через validate.
- Журнал SQL и производительностьЗапись SQL и значений параметров в журнал через Logback вместо show_sql, подсчёт запросов статистикой Hibernate, пакетная вставка JDBC и короткий список полезных привычек.
- Кеш второго уровняОбщий кеш сущностей для всех EntityManager: подключение JCache с Caffeine, пометка сущностей @Cacheable, проверка попаданий статистикой и то, чего кеш не покрывает.