`

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

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

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

    精通 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:对象持久化技术第二版part3

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

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

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

    从J2SE到J2EE知识点介绍

    (四) Hibernate 核心接口 194 1. Session接口 194 2. SessionFactory接口 194 3. Configuration类 194 4. Transaction接口 195 5. Query和Criteria接口 195 (五) Hibernate的安装和配置 195 1. 安装Hibernate 195 2....

    Spring面试题

    Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式,如图 1 所示。 组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下: ☆...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    第4章 利用JDBC和JTA访问 数据库和管理全局事务 178 4.1 JDBC和容器管理的数据源 179 4.1.1 JDBC概述 179 4.1.2 使用JDBC执行数据库访问 180 4.1.3 使用WebLogic服务器管理的 数据源 182 4.1.4 使用JBoss服务器管理...

    JBoss Seam 工作原理、seam和hibernate的范例、RESTFul的seam、seam-gen起步、seam组件、配置组件、jsf,jboss、标签、PDF、注解等等

    1.4. Seam 和jBPM:待办事项列表(todo list)示例..................................................................................................... 32 1.4.1. 理解代码....................................

    java视频教程Day01 免费

    4. Array (数组) 5. Object-Oriented Programming I (类与对象I) 6. Object-Oriented Programming II (类与对象II) 7. Object-Oriented Advanced Topic (类与对象高级特性) 8. Exceptions (异常) 9. 图形用户...

    可视化智能仓储管理系统.doc

    目 录 1概述 1 1.1背景 1 1.2应用领域与使用对象 1 1.3术语与缩写解释 1 2系统总体介绍 2 2.1系统架构 3 2.2可视化智能仓储管理系统的功能介绍 4 2.2.1出入库信息采集 4 2.2.2可视化查询 5 2.2.3作业管理 6 2.2.4...

    javapms门户网站源码

    Java作为一种重要的开发工具,它具有七个主要特性:安全性、核心API、开放式标准、分布式和动态结构、面向对象、多线程、内存管理。 TIOBE发布的编程语言排行榜 1.3. 完善合理的技术架构 系统选用了经过java社区长...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    其中使用Struts作为系统的整体基础架构,负责MVC的分离,在Struts框架的模型部分,控制业务跳转,利用Hibernate框架对持久层提供支持,Spring做管理,管理Struts和Hibernate。 WebStorage HTML新增的本地存储解决...

Global site tag (gtag.js) - Google Analytics