Жизненный цикл Entity

Базовый Java
≈ 1 мин чтения

Состояние 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() нельзя бездумно игнорировать.