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

理解这些状态有助于我们避免不必要的数据库操作,进而更好地控制对象生命周期和内存管理,正确的使用缓存和事务机制。