对象的状态转换图
持久化对象的状态
站在持久化的角度,Hibernate 把对象分为 4 种状态:持久化状态,临时状态,游离状态,删除状态。Session 的特定方法能使对象从一个状态转换到另一个状态。
临时对象(Transient):
在使用代理主键的情况下,OID 通常为 null
不处于 Session 的缓存中
在数据库中没有对应的记录
持久化对象(也叫”托管”)(Persist):
OID 不为 null
位于 Session 缓存中
若在数据库中已经有和其对应的记录,持久化对象和数据库中的相关记录对应
Session 在 flush 缓存时,会根据持久化对象的属性变化,来同步更新数据库
在同一个 Session 实例的缓存中,数据库表中的每条记录只对应唯一的持久化对象
删除对象(Removed):
在数据库中没有和其 OID 对应的记录
不再处于 Session 缓存中
一般情况下,应用程序不该再使用被删除的对象
游离对象(也叫”脱管”) (Detached):
OID 不为 null
不再处于 Session 缓存中
一般情况需下,游离对象是由持久化对象转变过来的,因此在数据库中可能还存在与它对应的记录
Session 的 save() 方法
Session 的 save() 方法使一个临时对象转变为持久化对象
Session 的 save() 方法完成以下操作:
把 News 对象加入到 Session 缓存中,使它进入持久化状态
选用映射文件指定的标识符生成器,为持久化对象分配唯一的 OID。在 使用代理主键的情况下,setId() 方法为 News 对象设置 OID 是无效的。
计划执行一条 insert 语句:在 flush 缓存的时候
Hibernate 通过持久化对象的 OID 来维持它和数据库相关记录的对应关系。当 News 对象处于持久化状态时,不允许程序随意修改它的 ID
persist() 和 save() 区别:
当对一个 OID 不为 Null 的对象执行 save() 方法时,会把该对象以一个新的 oid 保存到数据库中;但执行 persist() 方法时会抛出一个异常。
Session 的 get() 和 load() 方法
都可以根据跟定的 OID 从数据库中加载一个持久化对象
区别:
当数据库中不存在与 OID 对应的记录时,load() 方法抛出 ObjectNotFoundException 异常,而 get() 方法返回 null。
两者采用不同的延迟检索策略:load 方法支持延迟加载策略。而 get 不支持。
Session 的 update() 方法
Session 的 update() 方法使一个游离对象转变为持久化对象,并且计划执行一条 update 语句。
若希望 Session 仅当修改了 News 对象的属性时,才执行 update() 语句,可以把映射文件中 <class> 元素的 select-before-update 设为 true。该属性的默认值为 false
当 update() 方法关联一个游离对象时,如果在 Session 的缓存中已经存在相同 OID 的持久化对象,会抛出异常
当 update() 方法关联一个游离对象时,如果在数据库中不存在相应的记录,也会抛出异常.
Session 的 saveOrUpdate() 方法
Session 的 saveOrUpdate() 方法同时包含了 save() 与 update() 方法的功能
判定对象为临时对象的标准
Java 对象的 OID 为 null
映射文件中为 <id> 设置了 unsaved-value 属性,并且 Java 对象的 OID 取值与这个 unsaved-value 属性值匹配
Session 的 merge() 方法
Session 的 delete() 方法
Session 的 delete() 方法既可以删除一个游离对象,也可以删除一个持久化对象
Session 的 delete() 方法处理过程
计划执行一条 delete 语句
把对象从 Session 缓存中删除,该对象进入删除状态。
Hibernate 的 cfg.xml 配置文件中有一个 hibernate.use_identifier_rollback 属性,其默认值为 false,若把它设为 true,将改变 delete() 方法的运行行为:delete() 方法会把持久化对象或游离对象的 OID 设置为 null,使它们变为临时对象。
通过 Hibernate 调用存储过程
Work 接口:直接通过 JDBC API 来访问数据库的操作
package org.hibernate.jdbc; import java.sql.Connection; import java.sql.SQLException; import org.hibernate.HibernateException; /** * Contract for performing a discrete piece of JDBC work. * * @author Steve Ebersole */ public interface Work { /** * Execute the discrete work encapsulated by this work instance using the supplied connection. * * @param connection The connection on which to perform the work. * @throws SQLException Thrown during execution of the underlying JDBC interaction. * @throws HibernateException Generally indicates a wrapped SQLException. */ public void execute(Connection connection) throws SQLException; }
Session 的 doWork(Work) 方法用于执行 Work 对象指定的操作,即调用 Work 对象的 execute() 方法. Session 会把当前使用的数据库连接传递给 execute() 方法。
Work work = new Work(){ @Override public void execute(Connection connection) throws SQLException { String procedure = "{call testProcedure}"; CallableStatement cstmt = connection.prepareCall(procedure); cstmt.executeUpdate(); } }; session.doWork(work);
Hibernate 与触发器协同工作
Hibernate 与数据库中的触发器协同工作时, 会造成两类问题:
1. 触发器使 Session 的缓存中的持久化对象与数据库中对应的数据不一致:触发器运行在数据库中,它执行的操作对 Session 是透明的
2. Session 的 update() 方法盲目地激发触发器:无论游离对象的属性是否发生变化,都会执行 update 语句,而 update 语句会激发数据库中相应的触发器
解决方案:
在执行完 Session 的相关操作后,立即调用 Session 的 flush() 和 refresh() 方法,迫使 Session 的缓存与数据库同步(refresh() 方法重新从数据库中加载对象)
在映射文件的的 <class> 元素中设置 select-before-update 属性:当 Session 的 update 或 saveOrUpdate() 方法更新一个游离对象时,会先执行 Select 语句,获得当前游离对象在数据库中的最新数据,只有在不一致的情况下才会执行 update 语句。
相关推荐
在 Hibernate 框架中,Java 对象的状态管理和 Session 缓存是核心概念,它们直接影响着数据的持久化过程和数据库...同时,根据具体应用需求,选择合适的缓存清理策略和对象状态转换时机,以达到最佳的数据库操作效果。
8.3 Java对象在Hibernate持久化层的状态 8.3.1 临时对象的特征 8.3.2 持久化对象的特征 8.3.3 被删除对象的特征 8.3.4 游离对象的特征 8.4 Session接口的详细用法 8.4.1 Session的save()和persist()...
4. **其他辅助文件**:可能包括日志文件、错误报告等,帮助开发者调试和理解系统运行状态。 通过理解和实践这个项目,开发者不仅可以掌握SSH框架的整合技巧,还能了解如何设计和实现一个简单的Web应用,包括数据库...
本项目是一个基于Struts和Hibernate框架的图书管理系统,它提供了全面的图书管理、用户管理以及借阅归还等核心功能。系统选用MySQL作为后台数据库,用户只需导入提供的`library.sql`文件,即可快速部署并运行此系统...
本章还将介绍通过Hibernate API来保存、修改和删除具有关联关系的对象的方法。 7.1 建立多对一的单向关联关系 148 7.1.1 [many-to-one]元素的not-null属性 153 7.1.2 级联保存和更新 155 7.2 映射一对多双向关联...
这个“Hibernate 项目图片资料”压缩包很可能包含了一系列与Hibernate相关的图形化解释,帮助理解其核心概念、配置和使用方法。在本文中,我们将深入探讨Hibernate的关键知识点,以便更好地理解和应用。 1. **对象...
8.3 Java对象在Hibernate持久化层的状态 8.3.1 临时对象的特征 8.3.2 持久化对象的特征 8.3.3 被删除对象的特征 8.3.4 游离对象的特征 8.4 Session接口的详细用法 8.4.1 Session的save()和persist()...
1. **Session**: Session是Hibernate提供的核心接口之一,它代表了与数据库的一次会话。所有的数据库操作(如查询、保存、更新和删除)都需要通过Session来完成。 2. **SessionFactory**: SessionFactory是创建...
4. **对象状态管理**:跟踪对象的状态变化。 5. **查询执行**:执行 HQL 或 Criteria 查询。 6. **结果集处理**:将查询结果转换为 Java 对象。 ##### 4.3 关闭阶段 1. **关闭Session**:完成所有操作后关闭 ...
9. **实体生命周期**:Hibernate管理对象的生命周期,包括持久化、瞬时、托管和游离状态。手册会阐述这些状态的意义,以及在不同状态下对象的行为。 10. **实用工具与扩展**:除了基本功能,Hibernate还提供了许多...
本章还将介绍通过Hibernate API来保存、修改和删除具有关联关系的对象的方法。 7.1 建立多对一的单向关联关系 148 7.1.1 [many-to-one]元素的not-null属性 153 7.1.2 级联保存和更新 155 7.2 映射一对多双向关联...
- "2018-7-26-Hibernate-加载策略.pptx"可能涉及了Hibernate的对象状态管理,包括延迟加载、立即加载、批处理加载等策略。 - "05-2018-7-9-Hibernate-配置数据库连接池.pptx"可能介绍了如何在Hibernate中配置和使用...
8.3 Java对象在Hibernate持久化层的状态 8.3.1 临时对象的特征 8.3.2 持久化对象的特征 8.3.3 被删除对象的特征 8.3.4 游离对象的特征 8.4 Session接口的详细用法 8.4.1 Session的save()和persist()...
最后,通过源码分析,我们可以了解到Hibernate的工作原理,包括对象状态管理、持久化过程以及查询执行机制。这有助于开发者在实际项目中更好地优化代码,提高性能。 总之,《韩顺平Hibernate3.3视频教程源码4-5day...
然而,当程序结束时,这些对象会消失,因此需要一种方法来保存这些对象的状态。此外,在编写应用程序之前,数据可能已经存在,因此还需要一种方法来读取这些数据并将其表示为对象。手动编写用于处理这些任务的代码...
8.3 Java对象在Hibernate持久化层的状态 8.3.1 临时对象的特征 8.3.2 持久化对象的特征 8.3.3 被删除对象的特征 8.3.4 游离对象的特征 8.4 Session接口的详细用法 8.4.1 Session的save()和persist()...
- **Hibernate对象状态**: 介绍了瞬态、持久、游离等状态。 - **使对象持久**: 如何将对象变为持久状态。 - **加载一个对象**: 使用不同的方法加载持久化对象。 - **查询**: 使用HQL或其他查询语言执行复杂查询。
### Hibernate的核心功能 1. **对象关系映射**:Hibernate允许开发者使用面向对象的方式来处理数据库操作,而不是直接编写SQL语句。 2. **事务管理**:Hibernate内置了事务处理机制,能够帮助开发者更方便地管理...
它管理着系统中的各个组件,包括Struts2和Hibernate4,通过配置文件或注解来控制对象的生命周期和依赖关系。同时,Spring3还提供了事务管理、安全管理等企业级服务,为网上订餐管理系统提供稳定可靠的运行环境。 在...
Struts2和Hibernate是Java开发领域中非常重要的两个框架,它们在构建Web应用程序时起着核心作用。Struts2是一个MVC(Model-View-Controller)框架,它为Java EE平台提供了一种处理用户交互、业务逻辑和视图分离开来...