Назад к вопросам
Middle
156
questionbank

Каковы состояния сущностей в 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() (остается)