Hibernate - 實體生命週期



在 Hibernate 中,實體是指對映到資料庫表的物件。實體可以處於四種狀態之一:

  • 瞬時態 - 非持久態。剛剛例項化,或者可能呼叫了一些方法,但沒有與 Session 關聯。

  • 持久態 - 與 Session 關聯。一旦我們呼叫 save 或 persist,物件就處於持久態。

  • 脫管態 - 以前與 Session 關聯,但現在不再關聯。

  • 刪除態 - 當實體被標記為從資料庫中刪除時,它進入刪除態。

讓我們詳細討論每種狀態。

瞬時態

瞬時態意味著實體是非持久態的。它只是被例項化,或者可能呼叫了一些方法,但沒有與 Session 關聯。物件可以透過呼叫 savepersistsaveOrUpdate() 方法進入 持久態

示例

Employee employee = new Employee();
employee.setName("John Doe");
employee.setSalary(50000.0);

在上面的示例中,Employee 物件處於瞬時態,因為它尚未與 Hibernate 會話關聯。

持久態

持久態是指與會話的關聯。一旦我們呼叫 savepersist,物件就處於 持久態。當呼叫 delete() 方法時,持久物件可以變為 瞬時態。在 Session 上呼叫 get()load() 返回一個持久實體。

示例

Session session = sessionFactory.openSession();
session.beginTransaction();

Employee employee = new Employee();
employee.setName("John Doe");
employee.setSalary(50000.0);

session.save(employee); // The entity is now in the persistent //state

session.getTransaction().commit();
session.close();

在這裡,Employee 物件在使用 session.save() 方法儲存時變為持久態。對員工物件所做的任何更改都將反映在資料庫中。

脫管態

脫管態是指實體以前與會話關聯,但現在不再關聯的狀態。當管理它的 Hibernate 會話關閉時,實體進入脫管態。在這種狀態下,實體不再與任何會話關聯,對其所做的更改不會自動與資料庫同步。

示例

Session session = sessionFactory.openSession();
session.beginTransaction();

Employee employee = session.get(Employee.class, 1L);
session.getTransaction().commit();
session.close(); // The entity is now in the detached state

employee.setSalary(60000.0); // Changes are not synchronized with the database

刪除態

當實體被標記為從資料庫中刪除時,它進入刪除態。在這種狀態下,實體仍然與會話關聯,但在事務提交時將從資料庫中刪除。

示例

Session session = sessionFactory.openSession();
session.beginTransaction();

Employee employee = session.get(Employee.class, 1L);
session.delete(employee); // The entity is now in the removed state

session.getTransaction().commit();
session.close();

狀態之間的轉換

實體可以透過各種 Hibernate 方法在這些狀態之間轉換:

  • 瞬時態到持久態 - 呼叫 session.save() 或 session.persist() 方法,將實體從瞬時態移動到持久態。

  • 持久態到脫管態 - 呼叫 session.evict() 或 session.clear() 或 session.close() 方法,會導致實體處於脫管態。

  • 脫管態到持久態 - 呼叫 session.update() 或 session.merge() 方法來持久化脫管實體。

  • 持久態到刪除態 - 透過呼叫 session.delete() 方法刪除實體。

廣告