Короткий ответ
SessionFactory — «тяжёлая» потокобезопасная фабрика: она создаётся один раз на всё приложение на основе конфигурации, хранит метаданные маппингов и кэш второго уровня и порождает объекты Session. Session — основной интерфейс работы с базой: единица работы (unit of work) с методами CRUD, управления транзакциями, кэшем первого уровня и ленивой загрузкой. В JPA роли совпадают: EntityManagerFactory — аналог SessionFactory, а EntityManager — аналог Session.
Как это работает подробнее
Session не потокобезопасна: каждый поток или единица работы должна использовать собственную Session, полученную через openSession() или getCurrentSession() для сессии, привязанной к текущей транзакции. Поскольку Hibernate реализует спецификацию JPA, его Session и SessionFactory реализуют стандартные интерфейсы EntityManager и EntityManagerFactory.
- SessionFactory: создаётся один раз (например, из
hibernate.cfg.xml), дорога в создании, потокобезопасна, общая для всех сессий. - Session: открывается на единицу работы, предоставляет
save(),load(),update(),delete()и управление транзакциями. - EntityManager: JPA-аналог Session —
persist(),merge(),remove(),find(),createQuery(). - Практика: в современном коде обычно работают через стандартный JPA-API, а Hibernate остаётся реализацией под капотом.
Пример кода
Configuration configuration = new Configuration().configure("hibernate.cfg.xml");
SessionFactory sessionFactory = configuration.buildSessionFactory();
try (Session session = sessionFactory.openSession()) {
session.beginTransaction();
Employee emp = session.get(Employee.class, 1L);
session.getTransaction().commit();
}