- Hibernate 教程
- Hibernate - 首页
- ORM - 概述
- Hibernate - 概述
- Hibernate - 架构
- Hibernate - 环境
- Hibernate - 配置
- Hibernate - 会话
- Hibernate - 持久化类
- Hibernate - 映射文件
- Hibernate - 映射类型
- Hibernate - 示例
- Hibernate - 对象关系映射
- Hibernate - 级联类型
- Hibernate - 注解
- Hibernate - 查询语言
- Hibernate - Criteria 查询
- Hibernate - 原生 SQL
- Hibernate - 缓存
- Hibernate - 实体生命周期
- Hibernate - 批量处理
- Hibernate - 拦截器
- Hibernate - ID 生成器
- Hibernate - 保存图片
- Hibernate - log4j 集成
- Hibernate - Spring 集成
- Hibernate - Struts 2 集成
- Hibernate - Web 应用程序
- 映射表示例
- Hibernate - 基于层次结构的表
- Hibernate - 基于具体类的表
- Hibernate - 基于子类的表
- Hibernate 有用资源
- Hibernate - 问答
- Hibernate - 快速指南
- Hibernate - 有用资源
- Hibernate - 讨论
Hibernate - 实体生命周期
在 Hibernate 中,实体是指映射到数据库表的对象。实体可以处于四种状态之一:
瞬时态 - 非持久态。刚刚实例化,或者可能调用了一些方法,但没有与 Session 关联。
持久态 - 与 Session 关联。一旦我们调用 save 或 persist,对象就处于持久态。
脱管态 - 以前与 Session 关联,但现在不再关联。
删除态 - 当实体被标记为从数据库中删除时,它进入删除态。
让我们详细讨论每种状态。
瞬时态
瞬时态意味着实体是非持久态的。它只是被实例化,或者可能调用了一些方法,但没有与 Session 关联。对象可以通过调用 save、persist 或 saveOrUpdate() 方法进入 持久态。
示例
Employee employee = new Employee();
employee.setName("John Doe");
employee.setSalary(50000.0);
在上面的示例中,Employee 对象处于瞬时态,因为它尚未与 Hibernate 会话关联。
持久态
持久态是指与会话的关联。一旦我们调用 save 或 persist,对象就处于 持久态。当调用 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() 方法删除实体。