[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-hibernate-arkhitektura-hibernate-sessionfactory-session-transaction":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":19,"progress":20,"seo":21},750,"arkhitektura-hibernate-sessionfactory-session-transaction",19,"hibernate","Hibernate","🐻","Архитектура Hibernate: SessionFactory, Session, Transaction","Архитектура Hibernate строится вокруг трёх ключевых компонентов: SessionFactory, Session и Transaction.\n\n> Аналогия из жизни: SessionFactory — это завод, который создаёт рабочие станции (Session). Каждая станция обслуживает одного клиента (транзакцию) и после завершения работы закрывается. Завод стоит дорого — его строят один раз, а станции создают по мере необходимости.\n\n### Компоненты\n\nSessionFactory:\n- Тяжёлый, потокобезопасный объект, создаётся один раз при запуске приложения\n- Содержит маппинг-метаданные, конфигурацию, пул соединений\n- Создание SessionFactory — дорогая операция (парсинг аннотаций, валидация маппинга)\n- В JPA-терминах — EntityManagerFactory\n\nSession:\n- Лёгкий, не потокобезопасный объект, создаётся для каждой единицы работы\n- Представляет собой Persistence Context — кэш первого уровня\n- Отслеживает состояние загруженных сущностей (Dirty Checking)\n- В JPA-терминах — EntityManager\n\nTransaction:\n- Атомарная единица работы с БД\n- Все операции с БД должны выполняться в рамках транзакции\n\n\u003Cdetails>\n\u003Csummary>Пример: программное управление и Spring\u003C\u002Fsummary>\n\n```java\n\u002F\u002F Программное управление (без Spring)\nSessionFactory sessionFactory = new Configuration()\n    .configure()\n    .buildSessionFactory();\n\ntry (Session session = sessionFactory.openSession()) {\n    Transaction tx = session.beginTransaction();\n    try {\n        User user = new User(\"John\", \"john@example.com\");\n        session.persist(user);\n\n        User found = session.find(User.class, 1L);\n        found.setName(\"Jane\");\n        \u002F\u002F UPDATE сгенерируется автоматически при commit (Dirty Checking)\n\n        tx.commit();\n    } catch (Exception e) {\n        tx.rollback();\n        throw e;\n    }\n}\n\n\u002F\u002F С Spring — всё управляется автоматически через @Transactional\n@Service\npublic class UserService {\n    @Autowired\n    private EntityManager entityManager;\n\n    @Transactional\n    public void createUser(String name, String email) {\n        User user = new User(name, email);\n        entityManager.persist(user);\n        \u002F\u002F commit произойдёт автоматически при выходе из метода\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n### Взаимосвязь компонентов\n\n```\nApplication\n    └── SessionFactory (1 на приложение, потокобезопасный)\n            └── Session (1 на запрос\u002Fтранзакцию, НЕ потокобезопасный)\n                    ├── Persistence Context (L1 Cache)\n                    ├── Transaction\n                    └── JDBC Connection (из пула)\n```\n\n### Важное\n\n- SessionFactory — один на приложение, создаётся при старте; Session — один на единицу работы\n- Session = Persistence Context = кэш первого уровня\n- Session не потокобезопасна — никогда не делите её между потоками\n- В Spring Session привязана к `@Transactional` — открывается при входе, закрывается при выходе\n\n### Частые ошибки\n\n- Создавать SessionFactory повторно — это крайне дорогая операция; один раз при запуске\n- Использовать Session из разных потоков — приводит к непредсказуемому поведению и data corruption\n- Работать без транзакции — чтение без транзакции допустимо, но запись без транзакции приведёт к ошибке или потере данных\n- Длинные транзакции — держать Session открытой долго (например, на время HTTP-запроса + рендеринга) — anti-pattern Open Session in View\n\n### Как используется в 2026\n\n- Spring Boot полностью управляет жизненным циклом SessionFactory и Session\n- EntityManager (JPA) предпочтительнее Session (Hibernate) в коде — стандартный API\n- HikariCP — стандартный пул соединений, интегрированный с Hibernate через Spring Boot\n- Open Session in View по умолчанию включён в Spring Boot, но рекомендуется отключать (`spring.jpa.open-in-view=false`)\n\n> **На собеседовании:** интервьюер часто спрашивает «что такое Session и чем она отличается от SessionFactory». Ключевые моменты: SessionFactory — один, потокобезопасный, дорогой в создании; Session — много, не потокобезопасная, привязана к транзакции. Обязательно упомяните, что Session = Persistence Context = L1 Cache.","","middle",[15,16,7,17,18],"session","jpa","transaction","architecture",[],null,{"title":22,"description":23,"ogTitle":22,"ogDescription":24,"keywords":25,"schemaAnswer":34,"featuredSnippetReady":35},"Архитектура Hibernate: SessionFactory, Session, Transaction — Gymterview","Три ключевых компонента Hibernate: SessionFactory (один на приложение), Session (один на транзакцию, Persistence Context), Transaction. Примеры кода.","SessionFactory — один на приложение, Session — один на транзакцию, Transaction — атомарная единица работы. Разбираем взаимосвязь компонентов.",[26,27,28,29,30,31,32,33],"SessionFactory","Session","Transaction","Persistence Context","EntityManager","Hibernate архитектура","потокобезопасность","Java","SessionFactory — тяжёлый потокобезопасный объект, один на приложение, содержит метаданные маппинга. Session — лёгкий, не потокобезопасный, один на единицу работы, представляет Persistence Context (L1 Cache). Transaction — атомарная единица работы с БД. В Spring Session привязана к @Transactional, SessionFactory управляется автоматически.",true]