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() 方法删除实体。

广告
© . All rights reserved.