Может ли объект в Hibernate напрямую перейти из состояния persistent в transient?

«Может ли объект в Hibernate напрямую перейти из состояния persistent в transient?» — вопрос из категории Hibernate, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, напрямую — нельзя. Persistent-объект привязан к сессии и управляется Hibernate. Переход в transient состояние требует промежуточного шага через detached.

Почему? Persistent состояние означает, что объект ассоциирован с идентификатором в базе данных и отслеживается в кэше сессии (Persistence Context). Transient — это новый объект, не связанный с сессией и БД. Прямой переход нарушил бы консистентность.

Как сделать объект transient?

  1. Отсоединить объект от сессии, сделав его detached:
    • Вызвать session.evict(object).
    • Или закрыть сессию session.close().
  2. Сбросить идентификатор объекта (ID), если он был назначен.

Пример:

Session session = sessionFactory.openSession();
session.beginTransaction();
User user = session.get(User.class, 1L); // Состояние: PERSISTENT

session.evict(user); // Состояние: DETACHED
user.setId(null); // Сброс ID — ключевой шаг для перехода в TRANSIENT

// Теперь объект 'user' считается TRANSIENT.
// Он не связан с сессией и не имеет соответствия в БД.
session.getTransaction().commit();
session.close();

Важно: Без сброса ID объект останется detached, так как Hibernate «помнит» его связь с записью в БД по первичному ключу.