整体流程

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的情况
当我们调用了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()方法开不开事务都可以执行查询语句。
总结
以上所述是小编给大家介绍的hibernate4基本实现原理,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# hibernate4实现原理
# hibernate4快速入门实例详解
# springmvc4+hibernate4分页查询功能实现
# 浅谈SpringMVC+Spring3+Hibernate4开发环境搭建
# spring mvc4.1.6 spring4.1.6 hibernate4.3.11 mysql5
# struts2.3.24+spring4.1.6+hibernate4.3.11+mysql5.5.
# 解决Hibernate4执行save()或update()无效问题的方法
# Hibernate4在MySQL5.1以上版本创建表出错 type=InnDB
# SSH框架网上商城项目第1战之整合Struts2、Hibernate4.3和Spring4.2
# 主键
# 当我们
# 数据库中
# 抛出
# 池中
# 客户端
# 不存在
# 如果没有
# 不开
# 就不
# 字段名
# 会把
# 小编
# 的是
# 变成了
# 也就是说
# 还没有
# 那就
# 在此
# 不需要
相关文章:
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
建设网站制作价格,怎样建立自己的公司网站?
建站主机选购指南与交易推荐:核心配置解析
网站制作员失业,怎样查看自己网站的注册者?
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?
如何在云主机快速搭建网站站点?
,想在网上投简历,哪几个网站比较好?
如何通过WDCP绑定主域名及创建子域名站点?
建站主机与虚拟主机有何区别?如何选择最优方案?
企业微网站怎么做,公司网站和公众号有什么区别?
如何快速生成专业多端适配建站电话?
商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?
如何在Windows环境下新建FTP站点并设置权限?
GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?
建站之星如何快速生成多端适配网站?
如何在万网自助建站平台快速创建网站?
建站主机功能解析:服务器选择与快速搭建指南
建站之星ASP如何实现CMS高效搭建与安全管理?
如何选择高效便捷的WAP商城建站系统?
家庭建站与云服务器建站,如何选择更优?
如何配置FTP站点权限与安全设置?
北京建设网站制作公司,北京古代建筑博物馆预约官网?
如何通过远程VPS快速搭建个人网站?
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
如何在IIS管理器中快速创建并配置网站?
南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?
网站按钮制作软件,如何实现网页中按钮的自动点击?
小型网站建站如何选择虚拟主机?
建站主机系统SEO优化与智能配置核心关键词操作指南
ppt制作免费网站有哪些,ppt模板免费下载网站?
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
南宁网站建设制作定制,南宁网站建设可以定制吗?
香港服务器WordPress建站指南:SEO优化与高效部署策略
c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】
公司门户网站制作流程,华为官网怎么做?
完全自定义免费建站平台:主题模板在线生成一站式服务
创业网站制作流程,创业网站可靠吗?
测试制作网站有哪些,测试性取向的权威测试或者网站?
网页设计网站制作软件,microsoft office哪个可以创建网页?
在线制作视频网站免费,都有哪些好的动漫网站?
网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?
大连网站设计制作招聘信息,大连投诉网站有哪些?
如何通过老薛主机一键快速建站?
无锡营销型网站制作公司,无锡网选车牌流程?
子杰智能建站系统|零代码开发与AI生成SEO优化指南
怀化网站制作公司,怀化新生儿上户网上办理流程?
如何零基础开发自助建站系统?完整教程解析
如何在阿里云域名上完成建站全流程?
*请认真填写需求信息,我们会在24小时内与您取得联系。