`

Hibernate4实战 之第六部分:基本实现原理

 
阅读更多


整体流程
1:通过configuration来读cfg.xml文件
2:得到SessionFactory 工厂
3:通过SessionFactory 工厂来创建Session实例
4:通过Session打开事务
5:通过session的api操作数据库
6:事务提交
7:关闭连接
 
说明:以下分方法描述的实现流程并不是Hibernate的完整实现流程,也不是Hibernate的完整实现顺序,只是描述了Hibernate实现这些方法的主干和基本方式,主要是用来理解这些方法背后都发生了些什么,如果需要详细完整的实现流程,请查阅Hibernate相应文档和源代码
 当我们调用了session.save(UserModel)后:
1:TO--->PO: Hibernate先在缓存中查找,如果发现在内部缓存中已经存在相同id的PO,就认为这个数据已经保存了,抛出例外。
如果缓存中没有,Hibernate会把传入的这个TO对象放到session控制的实例池去,也就是把一个瞬时对象变成了一个持久化对象。
如果需要Hibernate生成主键值,Hibernate就会去生成id并设置到PO上
2:客户端提交事务或者刷新内存
3:根据model类型和cfg.xml中映射文件的注册来找到相应的hbm.xml文件
4:根据hbm.xml文件和model来动态的拼sql,如下:
insert into 表名(来自hbm.xml) (字段名列表(来自hbm.xml )) values(对应的值的列表(根据hbm.xml从传入的model中获取值))
5:真正用JDBC执行sql,把值添加到数据库
6:返回这个PO的id。
 
当我们调用了session.update(UserModel)后:
1:DO--->PO:首先根据model 的主键在hibernate的实例池中查找该对象,找到就抛出错误。
如果没有就DO--->PO,Hibernate会把传入的这个DO对象放到session控制的实例池去,也就是把一个瞬时对象变成了一个持久化对象
2:客户端提交事务或者刷新内存
3:根据model类型和cfg.xml中映射文件的注册来找到相应的hbm.xml文件
4:根据hbm.xml文件和model来动态的拼sql,不进行脏数据检查,如下:
update 表名(来自hbm.xml) set 字段名(来自hbm.xml )=值(根据hbm.xml从传入的model中获取值) where 条件
5:真正用JDBC执行sql,把值修改到数据库
 
当我们调用了session.update(UserModel)后:

1:首先根据model 的主键在hibernate的实例池中查找该对象,找到就使用该PO对象(用来检查脏数据)。
2:客户端提交事务或者刷新内存
3:Hibernate会进行脏数据检查,如果没有数据被修改,就不执行下面的步骤了。
4:根据model类型和cfg.xml中映射文件的注册来找到相应的hbm.xml文件
5:根据hbm.xml文件和model来动态的拼sql,进行脏数据检查(如果开启了dynamic-update的话),如下:
update 表名(来自hbm.xml) set 字段名(来自hbm.xml )=值(根据hbm.xml从传入的model中获取值) where 条件
6:真正用JDBC执行sql,把值修改到数据库
 
Id的生成方式为assigned的情况
当我们调用了session.delete(UserModel)后:
1:根据model的主键在数据库里面查找数据,来保证对象的存在,然后把找到的对象放到内存里面,如果此时在hibernate的实例池中已经存在对应的实体对象(注意:代理对象不算实体对象),就抛出例外。
2:如果此时在hibernate的实例池中不存在对应的实体对象,那么就把对象放到内存里面,但会标识成待删除的对象,就不可以被load等使用了。
3:如果对象还是不存在,那么就直接返回了(注意,这个时候是不抛出例外的)。也就是说,delete之前会执行一个查询语句。
4:客户端提交事务或者刷新内存
5:判断待删除的PO是否存在,存在才需要删除,否则不需要删除
6:如果要删除,才执行以下的步骤。先根据model类型和cfg.xml中映射文件的注册来找到相应的hbm.xml文件
7:根据hbm.xml文件和model来动态的拼sql,如下:
delete from 表名(来自hbm.xml) where 主键=值(来自model)
8:真正用JDBC执行sql,把数据从数据库中删除
 
Id的生成方式为非assigned的情况
n当我们调用了session.delete(UserModel)后:
1:根据model的主键在hibernate的实例池中查找对应的实体对象(注意:代理对象不算实体对象),找到就抛出例外。
2:如果内存中没有对应的实体对象,就什么都不做。
3:客户端提交事务或者刷新内存
4:先根据model类型和cfg.xml中映射文件的注册来找到相应的hbm.xml文件
5:根据hbm.xml文件和model来动态的拼sql,如下:
delete from 表名(来自hbm.xml) where 主键=值(来自model)
6:真正用JDBC执行sql,把数据从数据库中删除,如果数据不存在,就抛出例外
当我们调用了session.delete(UserModel)后:
1:根据model的主键在hibernate的实例池中查找对应的实体对象(注意:代理对象不算实体对象),找到就使用该对象。
2:如果内存中没有对应的实体对象,就到数据库中查找来保证对象的存在,把找到的对象放到内存里面,而且不会标识成待删除的对象,可以继续被load等使用。代理对象也需要去数据库中查找数据。
3:如果对象还是不存在,那么就抛出例外。也就是说,delete之前可能会执行一个查询语句。
4:客户端提交事务或者刷新内存
5:根据model类型和cfg.xml中映射文件的注册来找到相应的hbm.xml文件
6:根据hbm.xml文件和model来动态的拼sql,如下:
delete from 表名(来自hbm.xml) where 主键=值(来自model)
7:真正用JDBC执行sql,把数据从数据库中删除
当我们调用了s.load(UserModel.class, “主键值");后:
1:根据model类型和主键值在一级缓存中查找对象,找到就返回该对象
2:如果没有找到,判断是否lazy=true,如果是,那就生成一个代理对象并返回;否则就先查找二级缓存,二级缓存没有,就查找数据库。如果是返回代理对象的,在第一次访问非主键属性的时候,先查找二级缓存,二级缓存中没有才真正查找数据库。
3:如果需要查找数据库的话,会根据model类型和cfg.xml中映射文件的注册来找到相应的hbm.xml文件
4:根据hbm.xml文件和model来动态的拼sql,如下:
select 字段列表(来自hbm.xml) from 表名(来自hbm.xml) where 主键=值
5:真正用JDBC执行sql,把数据从数据库中查询出来到rs里面。如果找不到就报错
6:从结果集---〉Model,然后返回model
 
注意:load方法开不开事务都可以执行查询语句。

 
当我们调用了s.get(UserModel.class, “主键值");后:
1:先根据model类型和主键值查找缓存,如果存在具体的实体对象,就返回;如果存在实体的代理对象(比如前面load这条数据,但是还没有使用,那么load生成的是一个只有主键值的代理对象),那么查找数据库,把具体的数据填充到这个代理对象里面,然后返回这个代理对象,当然这个代理对象此时已经完全装载好数据了,跟实体对象没有什么区别了。
2:如果要查找数据库,先根据model类型和cfg.xml中映射文件的注册来找到相应的hbm.xml文件
3:根据hbm.xml文件和model来动态的拼sql,如下:
select 字段列表(来自hbm.xml) from 表名(来自hbm.xml) where 主键=值
4:真正用JDBC执行sql,把数据从数据库中查询出来到rs里面,没有值就返回null
5:从结果集---〉Model,然后返回model
 
注意:get方法开不开事务都可以执行查询语句。
 
当我们调用了q.list();后:
1:对HQL进行语义分析,分析出model来
2:根据model类型和cfg.xml中映射文件的注册来找到相应的hbm.xml文件
3:根据hbm.xml文件和model,来解析HQL,从而实现动态的把HQL转换成对应的sql,(从hql---〉sql这个过程是非常复杂的,不但区分不同的数据库,还包括了对sql进行自动的优化),这里只能简单的示例如下:
select 字段列表(来自hbm.xml) from 表名(来自hbm.xml) where 条件
4:真正用JDBC执行sql,把数据从数据库中查询出来到rs里面
5:从结果集---〉Model集合(或对象数组),然后返回model集合(或对象数组)
 
注意:list()方法开不开事务都可以执行查询语句。
 原创内容 转自请注明【  http://sishuok.com/forum/blogPost/list/2483.html#7182
视频配套PPT,视频地址【 Hibernate4实战-独家视频课程 】
8
6
分享到:
评论
1 楼 1927105 2014-03-25  
LZ研究过Hibernate4里的监听时间吗?我这边用4.3.4测试时发现监听事件一直不运行,知道是什么问题吗?谢谢了

相关推荐

    hibernate实战 英文版

    《Hibernate实战》是一部备受赞誉的关于Hibernate框架的专业书籍,被广泛认为是最权威的Hibernate著作之一。该书由Hibernate项目的核心开发者撰写,因此能够提供深入且独特的见解。在出版之初便获得了包括Java ...

    Hibernate4实战

    在第二部分中,《Hibernate4实战》详细讲解了Hibernate的配置过程。这包括`hibernate.cfg.xml`配置文件的解析,如何设置数据库连接信息(如驱动、URL、用户名和密码),以及如何定义日志级别和其他高级配置选项。...

    Hibernate实战(第2版 中文高清版)

     第6章 映射集合和实体关联   6.1 值类型的set、bag、list和map   6.1.1 选择集合接口   6.1.2 映射set   6.1.3 映射标识符bag   6.1.4 映射list   6.1.5 映射map   6.1.6 排序集合和有序集合  6.2 ...

    Hibernate实战第2版.zip

    《Hibernate实战第2版》是IT领域中关于Java持久化框架Hibernate的一本深入实践的书籍。Hibernate是一个开源的ORM(对象关系映射)框架,它为Java开发者提供了在关系数据库和面向对象编程之间架起桥梁的工具。这本书...

    hibernate开发与实战 源代码

    1. **Chapter 01 - 第一次接触Hibernate**: 这部分通常会介绍如何搭建Hibernate环境,包括配置Hibernate的核心配置文件(hibernate.cfg.xml)、实体类的创建以及持久化操作的基本语法。 2. **Chapter 06 - 排序(Order...

    轻量级J2EE企业应用实战——Struts+Spring+Hibernate整合开发 源码第五部分

    在本资源中,我们关注的是"轻量级J2EE企业应用实战——Struts+Spring+Hibernate整合开发"的源码第五部分。这个主题涉及到Java企业级应用开发中的三个核心框架:Struts、Spring和Hibernate的集成使用。下面将详细阐述...

    Hibernate实战(第2版)

    ### Hibernate实战(第2版)知识点详解 #### 一、Hibernate框架概述 1. **定义与特点**: - **Hibernate**是一种Java环境下基于JDBC API的ORM(Object Relational Mapping)框架,它提供了从Java类到数据库表以及从...

    精通hibernate3.0(第三版).rar

    4. Session和Transaction:深入理解Hibernate的Session接口,包括保存、更新、删除、加载和检索对象,以及事务处理的原理和API使用。 5. HQL和 Criteria查询:介绍Hibernate特有的面向对象的查询语言HQL,以及...

    精通Hibernate:Java对象持久化详解.zip

    通过阅读《精通Hibernate:Java对象持久化详解》,开发者可以深入了解Hibernate的工作原理,学习如何有效地使用它来实现对象持久化,从而提高开发效率,降低维护成本。这本书对于Java Web开发者,尤其是初次接触...

    精通hibernate

    - **第6章:缓存机制**:分析了Hibernate中的缓存策略,包括一级缓存、二级缓存的工作原理及应用场景。 #### 第三部分:实战篇 - **第7章:实战案例**:通过一个完整的项目示例,综合运用前面章节所学的知识,实现...

    hibernate学习资料大全

    以上只是压缩包中部分可能包含的知识点,实际学习资料可能包括教程文档、示例代码、实战项目等,通过深入学习和实践,开发者可以全面掌握Hibernate的精髓,并将其应用到实际开发中,提高开发效率,降低维护成本。...

    Hibernate DOC中文文档(学习Hibernate必备手册)

    6. **缓存机制**:介绍第一级缓存和第二级缓存的工作原理,以及如何配置和使用缓存来提高应用性能。 7. **实体生命周期**:阐述实体的持久化状态(瞬时、持久、托管和脱管),以及它们之间的转换过程,如保存、更新...

    hibernate完整资料

    通过学习这些文档,你将能够掌握Hibernate的基本使用方法,理解其工作原理,并能熟练地在实际项目中运用ORM技术,提高数据库操作的效率和灵活性。对于Java开发者来说,熟悉并掌握Hibernate是提升业务系统开发能力的...

    hibernate3.2.5.rar

    《深入剖析Hibernate 3.2.5:源码解析与实战指南》 Hibernate,作为一款广泛应用的Java对象关系映射(ORM)框架,为开发者提供了便捷的数据持久化解决方案。源代码的学习是理解其工作原理、优化应用的关键。本文将...

    J2EE 企业应用实战:Struts Spring Hibernate 整合开发

    4. **整合流程**:了解如何将Struts、Spring和Hibernate集成在一起,包括配置文件的设置,依赖注入的实现,以及事务的管理。 5. **最佳实践**:学习如何优化整合后的系统,例如使用Spring的声明式事务管理,以及合理...

    精通hibernate源码ch3

    4. 缓存机制:分析Hibernate如何实现缓存,包括一级缓存和二级缓存的工作原理。 五、实战应用 结合理论知识,Chapter 3可能会包含一些实际案例,演示如何在项目中应用Hibernate,例如创建一个简单的CRUD应用,或者...

    hibernate 电子书全集

    2. **Hibernate框架概述**:介绍Hibernate的架构、主要组件及其工作原理。 3. **配置Hibernate**:包括XML配置文件的设置、属性详解以及如何通过代码配置。 4. **实体类和映射文件**:讨论如何定义Java类以映射...

    hibernate in action 中文版书籍

    6. **事务和缓存**:讨论Hibernate的事务管理,包括编程式和声明式事务,以及第一级缓存和第二级缓存的原理和配置,提高数据访问性能。 7. **性能优化**:讲解如何针对特定场景优化Hibernate的使用,如延迟加载、...

Global site tag (gtag.js) - Google Analytics