Этот вопрос проверяет понимание основного интерфейса Hibernate для взаимодействия с базой данных и его жизненного цикла, что критично для корректного управления персистентностью объектов.
Hibernate Session — это центральный интерфейс фреймворка Hibernate, который инкапсулирует единицу работы с базой данных. Он не является потокобезопасным и обычно создаётся на короткое время (например, на один HTTP-запрос). Основная его задача — предоставить контекст персистентности (Persistence Context), который является кэшем первого уровня и отслеживает все сущности, загруженные или сохранённые в рамках этой сессии.
flush() Hibernate автоматически определяет, какие объекты были изменены, и генерирует соответствующие SQL-запросы UPDATE.Сессия используется в любом месте приложения, где требуется взаимодействие с базой данных через Hibernate. В веб-приложениях её часто связывают с контекстом запроса (например, паттерн "Open Session in View"). Сессия тесно связана с транзакцией, но это разные понятия: транзакция определяет границы атомарной операции, а сессия — контекст для работы с объектами.
// Получение фабрики сессий (обычно создаётся один раз на приложение)
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
// Открытие новой сессии
Session session = sessionFactory.openSession();
// Начало транзакции
Transaction tx = session.beginTransaction();
try {
// Сохранение новой сущности (перевод из transient в persistent)
Employee emp = new Employee("John Doe", "Engineering");
session.save(emp); // или persist()
// Загрузка сущности по ID
Employee loadedEmp = session.get(Employee.class, 1L);
if (loadedEmp != null) {
// Изменение объекта — Hibernate отследит это
loadedEmp.setDepartment("Marketing");
}
// Удаление сущности
session.delete(loadedEmp);
// Коммит транзакции — изменения синхронизируются с БД
tx.commit();
} catch (Exception e) {
tx.rollback();
throw e;
} finally {
// Важно закрыть сессию для освобождения ресурсов (например, соединения с БД)
session.close();
}Вывод: Hibernate Session — это ключевой компонент для управления персистентностью объектов. Его стоит применять для всех операций с базой данных в Hibernate, строго соблюдая его короткий жизненный цикл и обязательно закрывая после использования, чтобы избежать утечек памяти и соединений.