Hibernate
Раздел про Hibernate и JPA для Java простыми словами: ORM и маппинг сущностей, связи, persistence context, ленивая загрузка и N+1, JPQL и Criteria, кэширование, транзакции и блокировки, наследование и типичные грабли.
Раздел с нуля про Hibernate — самую распространённую реализацию JPA. Как объекты Java отображаются на таблицы, как устроен persistence context, откуда берутся LazyInitializationException и проблема N+1, как писать запросы и не наступить на типичные грабли ORM. Глубже, чем обзор Spring Data — читать лучше по порядку.
- Что такое ORM и Hibernate: от JDBC к объектно-реляционному маппингу — Простыми словами: что такое ORM, зачем он нужен, чем JPA отличается от Hibernate, когда ORM помогает, а когда мешает, и как это всё вписывается в Spring Boot.
- Маппинг сущностей в Hibernate и JPA — Как Hibernate связывает Java-классы с таблицами: @Entity, @Column, генерация ID, @Enumerated, @Embedded и @Transient — с разбором типичных ловушек.
- Связи между сущностями в Hibernate: @OneToMany, @ManyToOne, @ManyToMany — Разбираем @ManyToOne, @OneToMany, @ManyToMany, владеющую сторону, mappedBy и синхронизацию двунаправленных связей в Hibernate/JPA.
- Persistence context и состояния сущности в Hibernate — Что такое persistence context, как Hibernate отслеживает изменения автоматически и через какие состояния проходит сущность — от создания до удаления.
- Ленивая и жадная загрузка в Hibernate — Что такое FetchType.LAZY и EAGER, как работают прокси и ленивые коллекции, почему возникает LazyInitializationException и как правильно от неё избавиться.
- Проблема N+1 запросов в Hibernate — Что такое проблема N+1, как обнаружить лишние запросы и устранить их: JOIN FETCH, @EntityGraph, пакетная загрузка, DTO-проекции.
- JPQL, Criteria API и нативные запросы в Hibernate — Разбираем три способа писать запросы в JPA: JPQL — по сущностям, Criteria API — для динамических фильтров, Native SQL — когда ORM не справляется.
- Кэширование в Hibernate: первый уровень, второй уровень и кэш запросов — Как Hibernate кэширует данные на уровне сессии и между сессиями, зачем нужен второй уровень, когда он вреден и как работает кэш запросов.
- Транзакции, flush и блокировки в Hibernate — Как Hibernate управляет границами транзакций, когда происходит flush, и чем оптимистичная блокировка через @Version отличается от пессимистичной SELECT FOR UPDATE.
- Наследование сущностей в Hibernate: SINGLE_TABLE, JOINED, TABLE_PER_CLASS — Как Hibernate маппит иерархию классов на таблицы: три стратегии, @MappedSuperclass и практические советы по выбору подхода.
- Типичные ошибки с Hibernate: что идёт не так и как это исправить — Разбор частых граблей с Hibernate: неверный equals/hashCode, Open Session in View, возврат сущностей из контроллера, опасный CascadeType.ALL, массовые операции по одному и merge vs save.