整体流程

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
# 主键
# 当我们
# 数据库中
# 抛出
# 池中
# 客户端
# 不存在
# 如果没有
# 不开
# 就不
# 字段名
# 会把
# 小编
# 的是
# 变成了
# 也就是说
# 还没有
# 那就
# 在此
# 不需要
相关文章:
建站之星代理商如何保障技术支持与售后服务?
建站之星如何实现PC+手机+微信网站五合一建站?
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)
制作网页的网站有哪些,电脑上怎么做网页?
如何快速重置建站主机并恢复默认配置?
高端云建站费用究竟需要多少预算?
网站制作培训多少钱一个月,网站优化seo培训课程有哪些?
如何快速搭建自助建站会员专属系统?
在线制作视频网站免费,都有哪些好的动漫网站?
制作网站的模板软件,网站怎么建设?
网站制作企业,网站的banner和导航栏是指什么?
清除minerd进程的简单方法
如何快速搭建高效香港服务器网站?
如何在新浪SAE免费搭建个人博客?
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
南宁网站建设制作定制,南宁网站建设可以定制吗?
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
如何在IIS中新建站点并配置端口与物理路径?
网站制作说明怎么写,简述网页设计的流程并说明原因?
如何选择香港主机高效搭建外贸独立站?
如何在阿里云高效完成企业建站全流程?
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?
简历在线制作网站免费,免费下载个人简历的网站是哪些?
如何在IIS中新建站点并配置端口与IP地址?
建站之星3.0如何解决常见操作问题?
定制建站价位费用解析与套餐推荐全攻略
简易网站制作视频教程,使用记事本编写一个简单的网页html文件?
北京营销型网站制作公司,可以用python做一个营销推广网站吗?
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
如何在Ubuntu系统下快速搭建WordPress个人网站?
长沙做网站要多少钱,长沙国安网络怎么样?
定制建站哪家更专业可靠?推荐榜单揭晓
网站制作网站,深圳做网站哪家比较好?
广东专业制作网站有哪些,广东省能源集团有限公司官网?
我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?
打鱼网站制作软件,波克捕鱼官方号怎么注册?
教学网站制作软件,学习*后期制作的网站有哪些?
如何通过FTP服务器快速搭建网站?
如何获取上海专业网站定制建站电话?
5种Android数据存储方式汇总
非常酷的网站设计制作软件,酷培ai教育官方网站?
婚礼视频制作网站,学习*后期制作的网站有哪些?
如何用PHP快速搭建高效网站?分步指南
如何选择适配移动端的WAP自助建站平台?
建站之星客服服务时间及联系方式如何?
建站之星安装提示数据库无法连接如何解决?
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
一键制作网站软件下载安装,一键自动采集网页文档制作步骤?
*请认真填写需求信息,我们会在24小时内与您取得联系。