Жизненный цикл Entity
Состояние Entity зависит от связи с persistence context
Один и тот же объект может по-разному восприниматься JPA в разные моменты времени. Главный вопрос: знает ли о нём текущий persistence context и должен ли отслеживать его изменения.
- New. Обычный новый объект, который ещё не связан с persistence context.
- Managed. Объект находится под управлением context, и его состояние отслеживается.
- Detached. Объект имеет persistent identity, но текущий context им больше не управляет.
- Removed. Managed-объект помечен для удаления из базы.
persist переводит новый объект под управление
User user = new User(42L, "Mira");
entityManager.persist(user);
После persist() объект становится managed.
Это не нужно воспринимать как обязательный момент немедленного выполнения INSERT:
JPA синхронизирует изменения с базой в соответствии с работой persistence context и транзакции.
Detached-объект не отслеживается автоматически
User user = entityManager.find(User.class, 42L);
entityManager.detach(user);
user.setName("Nora");
После detach() изменение имени относится только к Java-объекту.
Текущий persistence context больше не следит за ним.
Если состояние detached-объекта нужно вернуть в управляемую модель, для этого существует merge().
merge() возвращает не тот же объект.
Метод копирует состояние в managed-экземпляр и возвращает именно его, поэтому результат
merge() нельзя бездумно игнорировать.
Проверь себя
Разбор задания
Ментор знает решение и поможет тебе прийти к нему самостоятельно
Войди, чтобы использовать Ментора
Ментор учитывает текущую задачу и историю диалога.
Войти
Проверь важные нюансы и ответ после собственной попытки.
Войди, чтобы посмотреть решение
Решение и разбор доступны после авторизации.
Войти