Hibernate 中的实体生命周期分为四种主要状态,理解这些状态对于正确管理实体对象和数据库之间的同步至关重要:
1. Transient(瞬时状态)
- 定义:对象刚被
new
出来,还没有被 Hibernate 管理,也没有与数据库中的记录对应。 - 特点:
- 没有持久化标识(即主键为
null
或未赋值) - 不会被自动保存到数据库
- 没有持久化标识(即主键为
- 示例:
User user = new User(); // 仅仅是一个普通的 Java 对象 user.setName("Tom"); // 现在是 Transient 状态
2. Persistent(持久化状态)
- 定义:对象与数据库中的记录相关联,并被当前 Hibernate
Session
所管理。 - 特点:
- 有持久化标识(主键已生成)
- 由 Hibernate 自动跟踪和管理,属性的任何更改都会同步到数据库(在事务提交或 flush 时)
- 如何进入该状态:
- 通过
session.save()
、session.persist()
、session.get()
、session.load()
等方法
- 通过
- 示例:
Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); User user = new User(); user.setName("Tom"); session.save(user); // user 现在是 Persistent 状态 tx.commit();
3. Detached(游离状态)
- 定义:对象原本是 Persistent,但其关联的 Session 已经关闭,Hibernate 不再管理它。
- 特点:
- 对象仍然有持久化标识
- 对它的修改不会自动同步到数据库
- 可通过
session.update()
、session.merge()
重新变为 Persistent
- 示例:
session.close(); // user 变成 Detached 状态 user.setName("Jerry"); // 修改不会同步到数据库
4. Removed(删除状态)
- 定义:对象处于 Persistent 状态,但已被标记为删除。
- 特点:
session.delete(entity)
后,Hibernate 会在事务提交或 flush 时从数据库中删除该记录- 仍由 Session 管理直到删除执行
- 示例:
session.delete(user); // user 变成 Removed 状态
总结图示:
new -> Transient
|
session.save() / get() / persist()
↓
Persistent -- session.close() --> Detached
|
session.delete()
↓
Removed
理解这些状态有助于我们避免不必要的数据库操作,进而更好地控制对象生命周期和内存管理,正确的使用缓存和事务机制。