Каковы состояния сущностей в Hibernate?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
В Hibernate сущность может находиться в одном из следующих состояний:
-
Transient (Переходное): Объект создан, но не связан с сессией Hibernate. У него нет представления в базе данных. Операции над ним выполняются в памяти, но не влияют на базу данных.
// Сущность Student создана, но не привязана к сессии Student student = new Student("Ivan", "Ivanov"); -
Persistent (Постоянное): Объект ассоциирован с текущей сессией Hibernate и управляется ею. Любые изменения объекта будут синхронизированы с базой данных при коммите транзакции или сбросе (flush) сессии. Объект, считанный из базы данных с помощью сессии, находится в этом состоянии.
// Сущность Student получена из базы данных или сохранена в ней Session session = sessionFactory.openSession(); session.beginTransaction(); Student student = new Student("Petr", "Petrov"); session.save(student); // student теперь в Persistent состоянии // Или // Student student = session.get(Student.class, 1L); // student в Persistent состоянии session.getTransaction().commit(); session.close(); -
Detached (Отсоединенное): Объект ранее был ассоциирован с сессией, но сессия была закрыта или объект был явно отсоединен (например, с помощью
session.evict(object)). Объект все еще содержит данные из базы данных, но изменения, внесенные в него, не будут автоматически синхронизированы с базой данных. Чтобы сохранить изменения, объект нужно снова присоединить к другой сессии.Session session1 = sessionFactory.openSession(); session1.beginTransaction(); Student student = session1.get(Student.class, 1L); // Persistent session1.getTransaction().commit(); session1.close(); // student теперь в Detached состоянии // Изменение объекта в Detached состоянии не влияет на базу данных student.setName("New Name"); // Для сохранения изменений нужно присоединить к новой сессии Session session2 = sessionFactory.openSession(); session2.beginTransaction(); session2.update(student); // student снова становится Persistent session2.getTransaction().commit(); session2.close();
Переходы между состояниями:
| Из состояния\В состояние | Transient | Persistent | Detached |
|---|---|---|---|
| Transient | (остается) | save(), persist(), saveOrUpdate() |
(невозможно напрямую) |
| Persistent | (невозможно) | (остается) | close(), evict(), clear() |
| Detached | (невозможно) | update(), merge(), saveOrUpdate() |
(остается) |