整体流程
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,把值修改到数据库
---------------------------------------------------------
_______________
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,把数据从数据库中删除
---------------------------------------
当我们调用了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()方法开不开事务都可以执行查询语句。
相关推荐
- **Spring核心容器**:详细介绍BeanFactory和ApplicationContext接口的作用,以及依赖注入(DI)和面向切面编程(AOP)的实现原理。 - **Spring MVC**:学习Spring MVC的工作机制,包括控制器(Controller)、模型...
### Hibernate4核心知识点详解 #### 一、Hibernate4简介与入门 **1.1 Hibernate4概述** Hibernate4是一款开源的对象关系映射(Object Relational Mapping, ORM)框架,它简化了Java应用程序与数据库之间的交互...
【hibernate教程】 在Java开发中,Hibernate是一个流行的ORM(对象关系映射)框架,它简化了数据库操作,使得开发者可以用面向对象的方式来处理数据库事务,而无需直接编写SQL语句。通过Hibernate,我们可以将Java...
本教程覆盖了从基本概念到实战案例的多个层次,适合初学者和有一定经验的开发者学习,进一步理解ORM和Hibernate框架的精髓。通过学习,读者应能独立完成基于Hibernate的数据库操作,并能灵活应对各种复杂的关联关系...
【Hibernate教程】 Hibernate 是一个强大的Java对象关系映射(ORM)框架,它为开发者提供了在Java应用程序中操作数据库的强大工具。本教程将深入探讨Hibernate的核心概念、配置、实体映射以及如何通过它来简化...
【hibernate教程ppt】是针对初学者设计的,旨在帮助理解对象关系映射(O/R Mapping)原理,掌握Hibernate这一流行的ORM框架的使用,并能够运用Hibernate进行实际的项目开发。教程涵盖了以下主要内容: 1. **什么是...
这个“Hibernate完整PPT教程”将深入讲解Hibernate的核心概念、工作原理以及如何在实际项目中应用。通过本教程,你将能够理解和掌握以下关键知识点: 1. **对象关系映射(ORM)** - ORM是一种编程技术,它允许...
**Hibernate教程概述** Hibernate是一个强大的Java对象关系映射(ORM)框架,它简化了...学习Hibernate教程,不仅能够掌握ORM的原理和实践,还能提升Java Web开发的技能,为构建高效、稳定的业务系统打下坚实基础。
《Hibernate 3.2 详细教程及课程笔记》是一份专为Java开发者设计的深入学习指南,旨在帮助已经具备Java基础知识的学习者熟练掌握Hibernate框架,并能够将其应用到实际的项目开发中。本教程覆盖了从基础概念到高级...
《经典Hibernate教程_从入门到精通》第一篇主要介绍了ORM概述和Hibernate的作用,以及Hibernate应用程序的基本结构和JDBC与Hibernate的对比。以下是详细的知识点解析: 1. **ORM概述** - ORM(Object-Relational ...
在这个项目中,“spring+struts2+hibernate整合实现分页”是一个基础教程,旨在帮助初学者理解如何在SSH框架下实现数据的分页展示。下面将详细讲解这个主题中的关键知识点。 1. **Spring框架**:Spring是Java应用的...
本教程将引导你逐步了解 Hibernate 的基本概念、安装配置以及核心功能,帮助你快速入门。 **一、Hibernate 概述** Hibernate 是一种用于简化数据库操作的 ORM 解决方案,它通过在 Java 对象与数据库表之间建立映射...
【Hibernate快速入门教程】 ...通过理解Hibernate的基本原理和配置,初学者可以迅速上手并开始开发基于Hibernate的应用。这个快速入门教程提供了清晰的步骤和简单的示例,是学习Hibernate的绝佳起点。
Hibernate工作原理的理解是掌握该框架的核心内容。Hibernate使用配置好的映射文件和主配置文件,在运行时自动将数据对象转换成数据库中的记录,并且可以将数据库记录转换回数据对象。Hibernate的懒加载、缓存策略...
综上所述,Hibernate教程涵盖了从基本概念到实战应用的全面知识,无论你是初学者还是有经验的开发者,都能从中获益,提高在J2EE环境下的数据库开发效率。通过深入学习和实践,你可以熟练掌握使用Hibernate进行Java...
**Hibernate 框架基础与应用** ...配合博客教程 `Hibernate-Usage(basis)`,你可以逐步了解并实践这些概念,从而深入理解 Hibernate 的核心功能和工作原理。通过实际操作,将有助于你更好地掌握这个强大的持久化框架。
《孙卫琴精通Hibernate Part2》是一份深入学习Hibernate框架的教程,主要涵盖了该框架的高级特性和实战应用。在本教程的第二部分,我们将会更深入地探讨Hibernate的各个重要方面,帮助开发者提升数据库操作的效率和...
总的来说,"struts2与hibernate整合单表增删改查"是一个完整的Java Web开发实战案例,涵盖了基本的CRUD操作和框架整合,对于初学者来说,通过这个案例可以深入理解这两个框架的工作原理和使用方式,为后续的开发工作...
1. Hibernate基本原理:Hibernate是一个开源的Java对象关系映射(ORM)框架,它简化了数据库操作,通过将Java对象与数据库表之间的映射关系进行管理,避免了大量SQL代码的编写。Hibernate提供了数据持久化的接口和...