Продвинутый Hibernate: решение вызовов уровня Enterprise
О чём курс
О чём курс
Михаил Поливаха разбирает производительность Hibernate, ограничения ORM и архитектурные задачи приложений с большой нагрузкой. Вы рассмотрите, как уменьшать число запросов, выбирать способ загрузки связей и обходить ситуации, в которых Fetch Join приводит к лишней выборке или ошибке MultipleBagFetchException. В курсе также сопоставляются Page, Slice и List, разбираются подсчёт строк и способы пагинации для больших наборов данных.
В блоке оптимизации показаны @BatchSize, StatelessSession, работа с Clob/Blob и ленивой загрузкой. Для длинных списков рассматривается Keyset, или Seek-based, пагинация и случаи, когда её применение не оправдано. Автор отдельно разбирает пакетные операции без затрат на Dirty Checking и кэш первого уровня. Заявленное ускорение таких операций в десять и более раз — оценка автора.
Архитектура и данные
На примерах enterprise-задач вы изучите Soft Delete в Hibernate 6, работу с крупными коллекциями и хранение иерархий. Для деревьев сопоставляются Adjacency List и Materialized Path, а также рассматриваются Recursive CTE и их отображение в JPA. Тема многопользовательской архитектуры охватывает @TenantId, разделяемую и отдельные схемы либо базы данных, TenantResolver и безопасность сессии.
Transactional Outbox разбирается как способ связать изменения в базе с отправкой сообщений в Kafka или RabbitMQ. В программе названы очередь в базе и polling publisher. Эти решения рассматриваются вместе с вопросами надёжности и масштабирования.
Кому подойдёт
Курс адресован Java- и Spring-разработчикам, которые работают с Hibernate и хотят понять поведение слоя доступа к данным. Техлиды и архитекторы найдут темы о сложных предметных областях, производительности и устройстве надёжных систем. Михаил Поливаха — Senior Software Engineer и контрибьютор Spring Data; он выступал на конференциях JPoint, Joker, Spring I/O Barcelona и Devoxx Belgium.
Программа обучения
Блок 1. Стратегии оптимизации: от базы к продвинутому тюнингу Цель: производительность «в моменте», применимо завтра
- findById vs getReferenceById (Proxy)
- Минимизируем количество Select при сохранении связей на ровном месте
- Page vs Slice vs List
- Разбор ситуаций, когда count(*) становится непозволительной роскошью
- @BatchSize
- Лечение N+1 в ситуациях, когда Join Fetch либо невозможен, либо от него больше вреда, чем пользы
- StatelessSession
- Bulk-задачи в обход Persistence Context, без dirty checking и L1 cache
- Pagination evolution
- Почему Offset убивает БД. Реализация Keyset (Seek-based) pagination. Разбор кейсов, когда Keyset pagination не стоит свеч
- Heavy columns
- Clob/Blob, @DynamicUpdate и bytecode enhancement для ленивой загрузки
Блок 2. Преодоление ограничений ORM: маппинг и выборки Цель: framework для типичных вызовов ORM/Hibernate
- Pageable + Fetch Join
- Мина замедленного действия (in-memory pagination), двухэтапная выборка и DTO-проекции
- MultipleBagFetchException
- Почему нельзя fetch нескольких коллекций, List → Set: плюсы и скрытые риски и альтернативы
Блок 3. Enterprise-кейсы: архитектура, надежность и big data Цель: разбор реальных enterprise проблем и решений
- Soft Delete
- Как выглядит правильная и производительная реализация Soft Delete в современных версиях Hibernate. Скрытые риски @SoftDelete
- Gigantic Collections
- Как жить, когда в @OneToMany могут быть сотни или даже тысячи элементов: почему обычные коллекции тут антипаттерн
- Transactional Outbox
- Доставка в Kafka/RabbitMQ без XA, polling publisher и очередь в БД
- Хранение Иерархии в БД
- Проверенные временем алгоритмы хранения графов и древовидных структур в БД. Adjacency List vs Materialized Path, Recursive CTE имаппинг в JPA
- Multi-tenancy в 2026
- Безопасная multi-tenancy архитектура. @TenantId в Hibernate 6, стратегии shared/separate schema/db, TenantResolver и безопасность сессии
Теги курса
Отзывов пока нет. Будьте первым!
Этот курс сейчас в процессе организации складчины. Нажмите кнопку «Записаться» и ожидайте старта — вам придёт уведомление. Когда складчина стартует, в карточке курса будет указан актуальный взнос. Текущая цена пока в процессе формирования и может отличаться от финальной.
Да, мы стремимся, чтобы финальный взнос был не больше ≈10% от оригинальной цены курса. Чем больше участников записывается в складчину, тем ниже выходит взнос для каждого.
Нажмите кнопку «Записаться» и авторизуйтесь на сайте через email (через ту же почту, которую будете использовать для входа). В личном кабинете вас будут ждать инструкции, как пригласить других участников — чем больше людей записалось, тем быстрее стартует складчина и тем ниже взнос. Как только складчина готова к приобретению, вам придёт уведомление.