[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-arkhitektura-prilozheniy-chto-takoe-pattern-unit-of-work":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":20,"progress":21,"seo":22},143,"chto-takoe-pattern-unit-of-work",3,"arkhitektura-prilozheniy","Архитектура приложений","🏗️","Что такое паттерн Unit of Work?","Unit of Work (Единица работы) -- паттерн, который отслеживает все изменения доменных объектов в рамках одной бизнес-операции и выполняет их в БД как единую атомарную транзакцию. Как корзина покупок в магазине: вы складываете товары, убираете ненужные, а на кассе всё оформляется одной операцией.\n\n```\n    ┌────────────────────────────────────────────┐\n    │             Unit of Work                   │\n    │                                            │\n    │  Новые:     [Payment A]                    │\n    │  Изменённые: [Account X, Account Y]        │\n    │  Удалённые:  []                            │\n    │                                            │\n    │  commit() → INSERT Payment A               │\n    │             UPDATE Account X               │\n    │             UPDATE Account Y               │\n    │             COMMIT                         │\n    └────────────────────────────────────────────┘\n```\n\n### Зачем нужен\n\n- Группировка нескольких операций в одну транзакцию.\n- Минимизация обращений к БД (batch insert\u002Fupdate).\n- Гарантия целостности данных -- либо все изменения применяются, либо ни одно.\n- Отслеживание изменений (dirty checking).\n\n### Реализация в Java\u002FSpring через JPA\u002FHibernate\n\nВ Java-экосистеме Unit of Work реализуется неявно через JPA\u002FHibernate. Persistence Context в JPA -- это и есть реализация паттерна Unit of Work:\n\n\u003Cdetails>\u003Csummary>Пример кода\u003C\u002Fsummary>\n\n```java\n@Service\npublic class TransferService {\n\n    @Transactional  \u002F\u002F Spring начинает Unit of Work\n    public void transfer(Long fromId, Long toId, BigDecimal amount) {\n        Account from = accountRepository.findById(fromId).orElseThrow();\n        Account to = accountRepository.findById(toId).orElseThrow();\n\n        from.withdraw(amount);   \u002F\u002F Hibernate отслеживает изменение (dirty)\n        to.deposit(amount);      \u002F\u002F Hibernate отслеживает изменение (dirty)\n\n        \u002F\u002F НЕ нужно вызывать save() -- Hibernate при commit()\n        \u002F\u002F автоматически выполнит UPDATE для всех \"грязных\" сущностей\n    }\n    \u002F\u002F По завершении метода Spring коммитит транзакцию\n    \u002F\u002F Hibernate выполняет flush() -- записывает все изменения в БД\n}\n```\n\n\u003C\u002Fdetails>\n\n### Как работает в Hibernate\n\n1. `@Transactional` начинает транзакцию и создаёт Persistence Context.\n2. Загруженные сущности отслеживаются (managed state).\n3. Изменения сущностей запоминаются в Persistence Context.\n4. При коммите (`flush()`) Hibernate сравнивает текущее состояние с исходным (dirty checking) и генерирует SQL.\n5. Все SQL выполняются в рамках одной транзакции.\n\n### Итог\n\nPersistence Context в JPA -- это реализация Unit of Work. Разработчику на Spring Boot редко приходится реализовывать этот паттерн вручную, но понимание его механики помогает избежать типичных ошибок: например, модификация detached-сущности не будет автоматически сохранена, потому что она находится вне Unit of Work.\n\n> **На собеседовании:** Интервьюер ожидает связь Unit of Work с Hibernate Persistence Context и `@Transactional`. Частая ошибка -- не знать, что dirty checking происходит автоматически, и вызывать `save()` для каждой managed-сущности.","","middle",[15,16,17,18,19],"unit-of-work","patterns","jpa","hibernate","architecture",[],null,{"title":23,"description":24,"ogTitle":23,"ogDescription":25,"keywords":26,"schemaAnswer":34,"featuredSnippetReady":35},"Паттерн Unit of Work: единица работы в JPA и Hibernate — Gymterview","Что такое паттерн Unit of Work? Отслеживание изменений, атомарные транзакции, реализация через Persistence Context в JPA\u002FHibernate. Примеры на Java.","Разбор паттерна Unit of Work: отслеживание изменений, dirty checking и реализация через Persistence Context в Hibernate.",[27,28,29,30,31,32,33],"Unit of Work","единица работы","Persistence Context","JPA","Hibernate","dirty checking","@Transactional","Unit of Work — паттерн, который отслеживает все изменения доменных объектов в рамках одной бизнес-операции и выполняет их в БД как единую атомарную транзакцию. Это обеспечивает группировку операций, минимизацию обращений к БД и целостность данных. В Java\u002FSpring реализуется неявно через JPA\u002FHibernate: аннотация @Transactional начинает транзакцию, Persistence Context отслеживает managed-сущности, а при коммите Hibernate выполняет dirty checking и генерирует SQL. Persistence Context в JPA — это и есть реализация Unit of Work.",true]