hibernate的执行流程

简介: hibernate的执行流程

引言


hibernate是一个开源的ORM框架,在很多程度上弥补了jdbc的不足之处,在中小企业中是比较好用的一个框架,为什么说在中小型企业中比较流行的,因为对于数据量较大或者是表关系比价复杂的场景,hibernate是有很多弊端的,因为hibernate的底层也是对jdbc的操作,所以也会生成sql语句,但是在生成sql语句的时候不会考虑性能方面,而是根据他自己的一个处理方法来自动生成,这其实在性能会影响性能,当数据量大或者表关系复杂的时候表现的非常明显。


下面就来简单介绍一个hibernate的加载流程、内部执行流程和状态的改变:


加载流程:

@Test
  public void testQueryPerson() {
    Configuration configuration = new Configuration();
    configuration.configure();// 记载配置文件
    SessionFactory sessionFactory = configuration.buildSessionFactory();
    Session session = sessionFactory.openSession();// 创建了一个数据库连接
    // Person 是对应持久化的类的名称
    List<Person> persons = session.createQuery("from Person").list();
    for (Person person : persons) {
      System.out.println(person.getName());
    }
    session.close();
  }

上面的代码我们可以用下面的图形化流程来表示,其中需要解释的就是在加载hibernate配置文件(hibernate.cfg.xml)之前需要将持久化类的映射文件加载到配置文件中。

         <mapping  resource="com/itheima11/hibernate/utils/Person.hbm.xml" />

20160926204613217.png


上面就是我们在利用hibernate执行CRUD操作的时候的一个加载流程,这个流程是比较简单的,下面以插入数据为例给大家介绍一下hibernate的内部执行流程,部分代码如下:


       @Test
  public void testSave() {
    Configuration configuration = new Configuration();
    configuration.configure();
    SessionFactory sessionFactory = configuration.buildSessionFactory();
    Session session = sessionFactory.openSession();
    Transaction transaction = session.beginTransaction();
    Person person = new Person();
    person.setName("王二麻子");
    person.setSex("纯爷们");
    session.save(person);
    transaction.commit();
    session.close();
  }

下面我们用一个流程图来解析上面代码在hibernate内部的执行过程:


20161007172625751.png


当我们在执行对数据库的CRUD操作的时候大概就会经历上面的几个过程,然后将结果返回。下面我们再来分析代码和我们操作的对象的状态的改变以及在内存中的位置。


20161007173151586.png



临时状态和脱管状态:

   

临时状态的对象肯定是从new创建来的

   

脱管状态的对象肯定是从持久化状态转化过来的

 

通过get方法在DB中获取的对象是持久化状态



20161007173650625.png分享一张状态转换图(游离状态也为托管状态)


20161007173825198.png

持久化状态的对象可以通过session.save/update/get方法把一个对象变成持久化对象变成持久化状态的对象只说明该对象进入了hibernate的区域和数据库没有关系,和数据库有关系的只有事务脱管状态的对象可以通过session.close/evic/clear方法是对象为托管状态。


小结


上面的博文就是在小编初始hibernate的时候对代码执行和内部机制的一些分析,通过分析和比较好的认识hibernate的内部运转机制,为以后更深入的了解hibernate做基础。

目录
相关文章
|
虚拟化
VMware虚拟机和主机互相ping不通排查以及解决
VMware虚拟机和主机互相ping不通排查以及解决
VMware虚拟机和主机互相ping不通排查以及解决
|
SQL 数据库
DM达梦数据库 - 设置忽略关键字方法,login关键字处理实例演示
DM达梦数据库 - 设置忽略关键字方法,login关键字处理实例演示
1675 0
DM达梦数据库 - 设置忽略关键字方法,login关键字处理实例演示
|
Linux 容器 Docker
环境异常解决方案-CentOS安装软件包找不到镜像
  今天准备搭建一套Docker环境,先安装了一个CentOS 7.2的虚拟机,然后使用【yum】命令来装其他的软件包,出现了如下消息: Loaded plugins: fastestmirror, langpacks One of the ...
2386 0
|
XML Java 应用服务中间件
Tomcat_servlet部署、编译、配置、打包
Tomcat_servlet部署、编译、配置、打包
234 0
|
安全 Linux 网络安全
【工具使用】几款优秀的SSH连接客户端软件工具推荐FinalShell、Xshell、MobaXterm、OpenSSH、PUTTY、Terminus、mRemoteNG、Terminals等
【工具使用】几款优秀的SSH连接客户端软件工具推荐FinalShell、Xshell、MobaXterm、OpenSSH、PUTTY、Terminus、mRemoteNG、Terminals等
114578 0
|
分布式计算 Hadoop Linux
Linux报错:mkdir:无法创建目录“/opt/apps/xxx/logs“: Permission denied
Linux报错:mkdir:无法创建目录“/opt/apps/xxx/logs“: Permission denied
862 0
CSDN--MD编辑器学习--图片插入尺寸和对齐方式
CSDN--MD编辑器学习--图片插入尺寸和对齐方式
328 0
|
存储 JavaScript 搜索推荐
《VitePress 简易速速上手小册》第3章:主题定制与扩展(2024 最新版)
《VitePress 简易速速上手小册》第3章:主题定制与扩展(2024 最新版)
510 0
|
缓存 Kubernetes Linux
基于minikube快速搭建kubernetes单节点环境
本文主要介绍在 Centos7 环境下基于 Minikube 来快速部署 Kubernetes 单节点集群环境,并在浏览器上访问部署在 k8s 上的 dashboard 服务。
1450 2
基于minikube快速搭建kubernetes单节点环境
|
Scala
Idea中创建scala项目中Cannot resolve plugin org.scala-tools:maven-scala-plugin: unknown
Idea中创建scala项目中Cannot resolve plugin org.scala-tools:maven-scala-plugin: unknown
330 0