Для чего нужен Hibernate
Что проверяют
Понимаете ли вы, что даёт ORM помимо избавления от ручного SQL, и знаете ли его цену.
Как отвечать
Hibernate это реализация JPA, то есть объектно-реляционное отображение: классы Java связываются с таблицами, а работа идёт с объектами, а не со строками результата.
Что он даёт:
- отображение и генерация SQL: аннотации на полях вместо ручной сборки запросов и разбора результата;
- контекст персистентности: кэш первого уровня в границах транзакции. Один и тот же объект в рамках транзакции загружается один раз;
- грязная проверка: изменили поле управляемой сущности, и при сбросе Hibernate сам сформирует
UPDATE. Явный вызов сохранения не нужен, и это удивляет тех, кто ждал обратного; - связи и каскады: работа с графом объектов вместо ручных соединений;
- ленивая загрузка: связанные данные подтягиваются при обращении;
- переносимость между СУБД за счёт диалектов;
- кэш второго уровня для редко меняющихся справочников.
Цена, о которой надо сказать честно, иначе ответ неполный:
- скрытый SQL: главная проблема это N+1, когда сто сущностей превращаются в сто первый запрос. Лечится соединением в запросе,
@EntityGraphили пакетной загрузкой; LazyInitializationExceptionпри обращении к ленивой связи вне транзакции;- пакетные операции: обновление миллиона строк через сущности работает на порядки медленнее одного запроса;
- порог входа: чтобы пользоваться безопасно, надо понимать состояния сущности и жизненный цикл контекста.
Практическое правило: включить показ генерируемого SQL и счётчик запросов на тесте. ORM не освобождает от знания SQL, а требует его: без этого сложно объяснить, откуда взялись лишние запросы.
Где спотыкаются
Считают Hibernate заменой знанию SQL.
Вызывают сохранение на управляемой сущности, не зная про грязную проверку.
Ставят везде жадную загрузку, чтобы убрать исключение ленивой инициализации.
Делают массовые обновления через сущности вместо запроса.