Hibernate持久化对象状态详解:四种状态及hbm2ddl.auto模式
需积分: 0 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` 属性)。这样可以保证关联关系的完整性。
2020-11-05 上传
2012-06-12 上传
2007-05-26 上传
点击了解资源详情
点击了解资源详情
点击了解资源详情
点击了解资源详情
2011-03-15 上传
2020-08-29 上传
简单的暄
- 粉丝: 25
- 资源: 2万+
最新资源
- Python中快速友好的MessagePack序列化库msgspec
- 大学生社团管理系统设计与实现
- 基于Netbeans和JavaFX的宿舍管理系统开发与实践
- NodeJS打造Discord机器人:kazzcord功能全解析
- 小学教学与管理一体化:校务管理系统v***
- AppDeploy neXtGen:无需代理的Windows AD集成软件自动分发
- 基于SSM和JSP技术的网上商城系统开发
- 探索ANOIRA16的GitHub托管测试网站之路
- 语音性别识别:机器学习模型的精确度提升策略
- 利用MATLAB代码让古董486电脑焕发新生
- Erlang VM上的分布式生命游戏实现与Elixir设计
- 一键下载管理 - Go to Downloads-crx插件
- Java SSM框架开发的客户关系管理系统
- 使用SQL数据库和Django开发应用程序指南
- Spring Security实战指南:详细示例与应用
- Quarkus项目测试展示柜:Cucumber与FitNesse实践