[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-spring-kak-rabotaet-transactional-v-kontekste-jpa":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":15,"progress":16,"seo":17},639,"kak-rabotaet-transactional-v-kontekste-jpa",14,"spring","Spring","🌱","Как работает @Transactional в контексте JPA?","`@Transactional` в контексте JPA управляет не только транзакциями БД, но и жизненным циклом Persistence Context -- «рабочей области» JPA, которая хранит загруженные сущности и отслеживает их изменения (кэш первого уровня).\n\n### Dirty Checking\n\n```java\n@Transactional\npublic void updateUserEmail(Long userId, String newEmail) {\n    User user = userRepository.findById(userId).orElseThrow();\n    \u002F\u002F user в состоянии MANAGED\n    user.setEmail(newEmail);\n    \u002F\u002F НЕ нужно вызывать save()!\n    \u002F\u002F Hibernate обнаружит изменение (dirty checking) и выполнит UPDATE при коммите\n}\n```\n\n### Состояния сущности JPA\n\n| Состояние | Описание |\n|-----------|----------|\n| NEW (Transient) | Новый объект, не связан с контекстом и БД |\n| MANAGED | Управляется контекстом, изменения отслеживаются |\n| DETACHED | Был управляемым, но контекст закрыт |\n| REMOVED | Помечен для удаления |\n\n### readOnly и оптимизация\n\n```java\n@Transactional(readOnly = true)\npublic User getUser(Long id) {\n    \u002F\u002F readOnly = true:\n    \u002F\u002F 1. Не делать dirty checking (экономия CPU)\n    \u002F\u002F 2. Не хранить snapshot-ы (экономия памяти)\n    \u002F\u002F 3. Потенциально использовать read-реплику\n    return userRepository.findById(id).orElseThrow();\n}\n```\n\n### Open Session in View (OSIV)\n\nПо умолчанию в Spring Boot включён `spring.jpa.open-in-view=true`, что держит Persistence Context открытым на протяжении всего HTTP-запроса. Рекомендуется отключить:\n\n```properties\nspring.jpa.open-in-view=false\n```\n\n> **На собеседовании:** ключевое -- dirty checking (автоматическое обнаружение изменений) и состояния сущностей. Частая ошибка -- изменять сущность внутри `@Transactional` метода, не осознавая, что Hibernate выполнит UPDATE даже без вызова `save()`.","","middle",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":20,"keywords":21,"schemaAnswer":22,"featuredSnippetReady":23},"Как работает @Transactional в контексте JPA? — Gymterview","`@Transactional` в контексте JPA управляет не только транзакциями БД, но и жизненным циклом Persistence Context -- «рабочей области» JPA, которая хранит загруже","`@Transactional` в контексте JPA управляет не только транзакциями БД, но и жизненным циклом Persistence Context -- «рабо",[7,13],"`@Transactional` в контексте JPA управляет не только транзакциями БД, но и жизненным циклом Persistence Context -- «рабочей области» JPA, которая хранит загруженные сущности и отслеживает их изменения (кэш первого уровня).",true]