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做基础。

目录
相关文章
|
7月前
|
前端开发
SpringMVC的执行流程
SpringMVC的执行流程
|
7月前
|
Java 关系型数据库 数据库连接
MyBatis 执行流程分析
MyBatis 执行流程分析
59 2
|
7月前
|
XML 存储 JSON
SpringMVC执行流程
SpringMVC执行流程
35 0
|
SQL XML 缓存
mybatis执行流程
mybatis执行流程
110 0
|
Java 数据库连接 API
十二.Spring源码剖析-Transactional 事务执行流程
上一篇《[Transactional源码解析](https://blog.csdn.net/u014494148/article/details/118398677)》我们介绍了Spring对Transactional的解析,也就是事务的初始化工作,这一篇我们接着来分析事务的执行流程。
|
7月前
|
SQL 缓存 Java
MyBatis Plus插件机制与执行流程原理分析
MyBatis Plus插件机制与执行流程原理分析
349 0
|
前端开发 Java
springMVC执行流程详解
springMVC执行流程详解
135 0
springMVC执行流程详解
|
存储 JSON 前端开发
你知道 SpringMVC的 执行流程 吗?
你知道 SpringMVC的 执行流程 吗?
121 0
|
SQL XML Java
MyBatis -- 执行流程
MyBatis的执行流程可以概括为: 读取核心配置文件 - 创建会话工厂 - 创建会话 - 将Mapper接口和Mapper映射文件做映射,获取Mapper实例对象 - 执行Mapper对象方法
145 0
|
前端开发 Java 调度
springMVC执行流程
springMVC执行流程
117 0