Hibernate持久化对象状态详解:四种状态及hbm2ddl.auto模式

需积分: 0 2 下载量 90 浏览量 更新于2024-08-23 收藏 7.15MB PPT 举报
Hibernate 是一个广泛使用的对象关系映射 (ORM) 框架,用于将 Java 对象持久化到关系数据库。在处理对象的状态管理时,Hibernate 将对象划分为四个关键状态: 1. **持久化状态(Persistent State)**: 当一个对象首次通过 `session.save()` 方法保存到数据库时,它处于持久化状态。在这个状态下,对象与数据库中的记录建立了映射关系,并且可以被查询和修改。 2. **临时状态(Transient State)**: 这是对象的新建或刷新后还未与数据库交互的状态。它们在内存中存在,但还没有被添加到持久化上下文(Session)中,此时对这些对象的任何更改都不会反映到数据库中。 3. **游离状态(Detached State)**: 当一个已经持久化过的对象不再与任何 `Session` 相关联时,它进入游离状态。例如,如果从缓存中移除一个对象,或者从数据库中检索出对象并手动将其从 `Session` 中移除。这时,对这些对象的修改需要重新关联到 `Session` 才能持久化。 4. **删除状态(Deleted State)**: 当调用 `session.delete()` 或者设置对象的 `hibernate.id` 属性为 `null` 时,对象进入删除状态。这个状态的对象在下次 `Session.flush()` 时会被从数据库中删除。 关于 `hbm2ddl.auto` 配置选项: - **create**: 在第一次运行时,Hibernate 会根据实体类生成数据库表,如果表已存在则会被删除并重建。这对于开发环境测试数据初始化非常有用,但在生产环境中不推荐,因为每次部署都会导致数据丢失。 - **create-drop**: 类似于 create,但当 `SessionFactory` 关闭时,数据库表会被自动删除,适用于测试环境。 - **update**: 最常用的选择,既生成表又维护表结构。如果表结构改变,新数据会插入,但旧数据保持不变。 - **validate**: 只检查数据库中的表结构是否与映射定义匹配,不会创建新表。适合用来验证模型的完整性,不会执行插入操作。 在示例代码中,创建了多个 `Customer` 和 `Order` 对象,并将 `Customer` 对象设置为订单的关联对象。当调用 `session.save()` 时,`Order` 对象会变为持久化状态。其中,针对一对一关联,如果采用延迟加载策略,应确保 `<one-to-one>` 元素的 `constrained` 属性设置为 `true`,这确保了 Order 对象关联的 Customer 对象不能为空(类似于 `<many-to-one>` 的 `not-null` 属性)。这样可以保证关联关系的完整性。