Этап 5 из 15 · ≈ 6 ч

ORM и доступ к данным

Основа с Junior

Hibernate, SQLAlchemy и аналоги — persistence context, ленивая загрузка, N+1.

Что важно знать

  • ORM отображает строки на объекты и избавляет от рутины, но SQL под ним никуда не исчезает — его нужно видеть в логах.
  • N+1: загрузили список, а связанные сущности подгружаются по одной. Лечится JOIN FETCH, entity graph, пакетной загрузкой.
  • Persistence context: кэш первого уровня, отслеживание изменений, сброс при коммите.
  • Ленивая загрузка вне транзакции — LazyInitializationException и аналоги.
  • Отчёты и сложные выборки — часто лучше SQL или проекции.

Критерии освоения

Junior ≈ 6 ч

  • Сохраняет и загружает сущности через ORM и пишет параметризованные запросы

Практика. Реализовать репозиторий заказов через ORM с тестами на реальной базе.

Middle ≈ 8 ч

  • Находит и устраняет проблему N+1 жадной загрузкой или отдельным запросом
  • Объясняет жизненный цикл сущности и persistence context
  • Решает, когда писать SQL вручную вместо ORM

Практика. Найти N+1 в учебном проекте по логу SQL, исправить и замерить число запросов до и после.

Проверка знаний

Войдите, чтобы пройти тест: сданный тест отмечает тему пройденной на карте и в ИПР.

Вопросы с собеседований

Смотреть все
Чем PreparedStatement безопаснее обычного Statement?Junior

PreparedStatement передаёт текст запроса и значения раздельно: значение никогда не разбирается как SQL — инъекция невозможна. Statement склеивает строку и выполняет как есть.

Полный разбор
Что такое проблема N+1 запросов и как её решать?Middle

N+1 — один запрос за списком и ещё по запросу на связанные данные каждого элемента: 100 заказов → 101 запрос. Причина — ленивая загрузка связей в цикле.

Полный разбор
Что такое JDBC?Junior

JDBC — стандартный API Java для работы с реляционными базами: Connection, PreparedStatement, ResultSet. Реализацию для конкретной СУБД поставляет драйвер.

Полный разбор
Как в JDBC выполнить несколько операций в одной транзакции вручную?Middle

conn.setAutoCommit(false) → операции → commit(); при исключении rollback(); в finally вернуть autocommit и закрыть соединение.

Полный разбор
Что делает ORM?Junior

ORM связывает объекты и таблицы: вы работаете с сущностями, а SQL для загрузки и сохранения генерируется автоматически.

Полный разбор
Почему возникает LazyInitializationException в Hibernate и как его правильно лечить?Middle

Ленивую связь трогают после закрытия сессии (вне транзакции, в контроллере или сериализаторе) — прокси не может выполнить запрос и бросает исключение.

Полный разбор
Что такое SQL-инъекция и как от неё защититься?Junior

Инъекция — данные пользователя попадают в текст запроса и меняют его смысл: ' OR '1'='1 превращает проверку пароля в «всегда истина».

Полный разбор
Чем INNER JOIN отличается от LEFT JOIN?Junior

INNER JOIN оставляет только совпавшие пары; LEFT JOIN сохраняет все строки левой таблицы и дополняет их NULL, если пары нет.

Полный разбор

Разборы темы

← Вся карта «Backend-разработчик»

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования