middle
Архитектура Hibernate: SessionFactory, Session, Transaction
Архитектура Hibernate строится вокруг трёх ключевых компонентов: SessionFactory, Session и Transaction.
Аналогия из жизни: SessionFactory — это завод, который создаёт рабочие станции (Session). Каждая станция обслуживает одного клиента (транзакцию) и после завершения работы закрывается. Завод стоит дорого — его строят один раз, а станции создают по мере необходимости.
Компоненты
SessionFactory:
- Тяжёлый, потокобезопасный объект, создаётся один раз при запуске приложения
- Содержит маппинг-метаданные, конфигурацию, пул соединений
- Создание SessionFactory — дорогая операция (парсинг аннотаций, валидация маппинга)
- В JPA-терминах — EntityManagerFactory
Session:
- Лёгкий, не потокобезопасный объект, создаётся для каждой единицы работы
- Представляет собой Persistence Context — кэш первого уровня
- Отслеживает состояние загруженных сущностей (Dirty Checking)
- В JPA-терминах — EntityManager
Transaction:
- Атомарная единица работы с БД
- Все операции с БД должны выполняться в рамках транзакции
Пример: программное управление и Spring
// Программное управление (без Spring)
SessionFactory sessionFactory = new Configuration()
.configure()
.buildSessionFactory();
try (Session session = sessionFactory.openSession()) {
Transaction tx = session.beginTransaction();
try {
User user = new User("John", "john@example.com");
session.persist(user);
User found = session.find(User.class, 1L);
found.setName("Jane");
// UPDATE сгенерируется автоматически при commit (Dirty Checking)
tx.commit();
} catch (Exception e) {
tx.rollback();
throw e;
}
}
// С Spring — всё управляется автоматически через @Transactional
@Service
public class UserService {
@Autowired
private EntityManager entityManager;
@Transactional
public void createUser(String name, String email) {
User user = new User(name, email);
entityManager.persist(user);
// commit произойдёт автоматически при выходе из метода
}
}
Взаимосвязь компонентов
Пример
Application
└── SessionFactory (1 на приложение, потокобезопасный)
└── Session (1 на запрос/транзакцию, НЕ потокобезопасный)
├── Persistence Context (L1 Cache)
├── Transaction
└── JDBC Connection (из пула)
Важное
- SessionFactory — один на приложение, создаётся при старте; Session — один на единицу работы
- Session = Persistence Context = кэш первого уровня
- Session не потокобезопасна — никогда не делите её между потоками
- В Spring Session привязана к
@Transactional— открывается при входе, закрывается при выходе
Частые ошибки
- Создавать SessionFactory повторно — это крайне дорогая операция; один раз при запуске
- Использовать Session из разных потоков — приводит к непредсказуемому поведению и data corruption
- Работать без транзакции — чтение без транзакции допустимо, но запись без транзакции приведёт к ошибке или потере данных
- Длинные транзакции — держать Session открытой долго (например, на время HTTP-запроса + рендеринга) — anti-pattern Open Session in View
Как используется в 2026
- Spring Boot полностью управляет жизненным циклом SessionFactory и Session
- EntityManager (JPA) предпочтительнее Session (Hibernate) в коде — стандартный API
- HikariCP — стандартный пул соединений, интегрированный с Hibernate через Spring Boot
- Open Session in View по умолчанию включён в Spring Boot, но рекомендуется отключать (
spring.jpa.open-in-view=false)
На собеседовании: интервьюер часто спрашивает «что такое Session и чем она отличается от SessionFactory». Ключевые моменты: SessionFactory — один, потокобезопасный, дорогой в создании; Session — много, не потокобезопасная, привязана к транзакции. Обязательно упомяните, что Session = Persistence Context = L1 Cache.