`

hibernate4之对象状态图和核心方法

 
阅读更多

 

对象的状态转换图



 

持久化对象的状态

 

站在持久化的角度,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 语句。

 

  • 大小: 42.6 KB
  • 大小: 11.2 KB
  • 大小: 71.9 KB
  • 大小: 10.8 KB
分享到:
评论

相关推荐

    Hibernate对象持久化状态

    在 Hibernate 框架中,Java 对象的状态管理和 Session 缓存是核心概念,它们直接影响着数据的持久化过程和数据库...同时,根据具体应用需求,选择合适的缓存清理策略和对象状态转换时机,以达到最佳的数据库操作效果。

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     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()...

    struts+spring+hibernate实现图书修改和删除

    4. **其他辅助文件**:可能包括日志文件、错误报告等,帮助开发者调试和理解系统运行状态。 通过理解和实践这个项目,开发者不仅可以掌握SSH框架的整合技巧,还能了解如何设计和实现一个简单的Web应用,包括数据库...

    Struts hibernate 图书管理

    本项目是一个基于Struts和Hibernate框架的图书管理系统,它提供了全面的图书管理、用户管理以及借阅归还等核心功能。系统选用MySQL作为后台数据库,用户只需导入提供的`library.sql`文件,即可快速部署并运行此系统...

    精通hibernate:对象持久化技术孙卫琴第二版part2

    本章还将介绍通过Hibernate API来保存、修改和删除具有关联关系的对象的方法。 7.1 建立多对一的单向关联关系 148 7.1.1 [many-to-one]元素的not-null属性 153 7.1.2 级联保存和更新 155 7.2 映射一对多双向关联...

    Hibernate 项目图片资料

    这个“Hibernate 项目图片资料”压缩包很可能包含了一系列与Hibernate相关的图形化解释,帮助理解其核心概念、配置和使用方法。在本文中,我们将深入探讨Hibernate的关键知识点,以便更好地理解和应用。 1. **对象...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     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持久化对象技术.pdf

    1. **Session**: Session是Hibernate提供的核心接口之一,它代表了与数据库的一次会话。所有的数据库操作(如查询、保存、更新和删除)都需要通过Session来完成。 2. **SessionFactory**: SessionFactory是创建...

    Hibernate 工作原理图Hibernate 工作原理图

    4. **对象状态管理**:跟踪对象的状态变化。 5. **查询执行**:执行 HQL 或 Criteria 查询。 6. **结果集处理**:将查询结果转换为 Java 对象。 ##### 4.3 关闭阶段 1. **关闭Session**:完成所有操作后关闭 ...

    hibernate中文开发手册

    9. **实体生命周期**:Hibernate管理对象的生命周期,包括持久化、瞬时、托管和游离状态。手册会阐述这些状态的意义,以及在不同状态下对象的行为。 10. **实用工具与扩展**:除了基本功能,Hibernate还提供了许多...

    精通Hibernate:对象持久化技术第二版part3

    本章还将介绍通过Hibernate API来保存、修改和删除具有关联关系的对象的方法。 7.1 建立多对一的单向关联关系 148 7.1.1 [many-to-one]元素的not-null属性 153 7.1.2 级联保存和更新 155 7.2 映射一对多双向关联...

    Hibernate 简单 PPT 总结

    - "2018-7-26-Hibernate-加载策略.pptx"可能涉及了Hibernate的对象状态管理,包括延迟加载、立即加载、批处理加载等策略。 - "05-2018-7-9-Hibernate-配置数据库连接池.pptx"可能介绍了如何在Hibernate中配置和使用...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     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()...

    韩顺平hibernate3.3视频教程源码4-5day

    最后,通过源码分析,我们可以了解到Hibernate的工作原理,包括对象状态管理、持久化过程以及查询执行机制。这有助于开发者在实际项目中更好地优化代码,提高性能。 总之,《韩顺平Hibernate3.3视频教程源码4-5day...

    Hibernate 概述

    然而,当程序结束时,这些对象会消失,因此需要一种方法来保存这些对象的状态。此外,在编写应用程序之前,数据可能已经存在,因此还需要一种方法来读取这些数据并将其表示为对象。手动编写用于处理这些任务的代码...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     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()...

    hibernate4.1中文api

    - **Hibernate对象状态**: 介绍了瞬态、持久、游离等状态。 - **使对象持久**: 如何将对象变为持久状态。 - **加载一个对象**: 使用不同的方法加载持久化对象。 - **查询**: 使用HQL或其他查询语言执行复杂查询。

    hibernate 图书 资料

    ### Hibernate的核心功能 1. **对象关系映射**:Hibernate允许开发者使用面向对象的方式来处理数据库操作,而不是直接编写SQL语句。 2. **事务管理**:Hibernate内置了事务处理机制,能够帮助开发者更方便地管理...

    基于Java S2SH框架开发的网上订餐管理系统 (struts2,hibernate4,spring3)

    它管理着系统中的各个组件,包括Struts2和Hibernate4,通过配置文件或注解来控制对象的生命周期和依赖关系。同时,Spring3还提供了事务管理、安全管理等企业级服务,为网上订餐管理系统提供稳定可靠的运行环境。 在...

    struts2+hibernate3.3图书管理系统

    Struts2和Hibernate是Java开发领域中非常重要的两个框架,它们在构建Web应用程序时起着核心作用。Struts2是一个MVC(Model-View-Controller)框架,它为Java EE平台提供了一种处理用户交互、业务逻辑和视图分离开来...

Global site tag (gtag.js) - Google Analytics