Получить доступ

Что верно про persistence context (сессию) в JPA?

MiddleORM и N+1Hibernate / JPA
Ещё спрашивают так:
  • Что такое кэш первого уровня в Hibernate?
  • Какие состояния бывают у сущности JPA?
Коротко

Persistence context — кэш первого уровня и единица работы: одна сущность в одном экземпляре на сессию, изменения отслеживаются автоматически (dirty checking) и сбрасываются при flush.

  • Состояния: transient, managed, detached, removed
  • Изменили поле managed-сущности — UPDATE уйдёт при flush без явного save
  • Сессия не потокобезопасна и живёт в пределах транзакции

А ещё Большие пакетные операции раздувают контекст — нужен flush и clear

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Сессия хранит снимок загруженных сущностей и при flush сравнивает его с текущим состоянием, генерируя UPDATE только для реально изменённых — отсюда и работает изменение объекта без явного вызова save. Гарантия тождества внутри сессии тоже полезна: два поиска по одному идентификатору вернут один и тот же объект. Обратная сторона — размер: загрузив в одну транзакцию сотни тысяч сущностей, вы получите и память под снимки, и дорогой flush, поэтому при пакетной обработке сессию периодически очищают. Сессия не потокобезопасна и живёт в пределах одного потока и, как правило, одной транзакции.

Что хотят услышать

  • Кэш первого уровня и идентичность сущностей.
  • Dirty checking и flush.
  • Четыре состояния сущности.

Частые ошибки

  • Загружать в одну транзакцию огромные объёмы сущностей.
  • Считать, что для сохранения изменений обязательно нужен явный вызов метода репозитория.

Проверьте себя

Несколько верных вариантов. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Это кэш первого уровня: повторный поиск по тому же идентификатору в одной сессии не идёт в базу
  • ✓Изменения управляемых сущностей попадают в базу при flush благодаря dirty checking — вызывать save не требуется
  • ✓Сущность может быть в состоянии transient, managed, detached или removed
  • ✗Persistence context разделяется между потоками приложения

Что спросят дальше

  • Чем кэш первого уровня отличается от кэша второго уровня?
  • Когда происходит flush, если его не вызывать явно?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем