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

目录
打赏
0
0
0
0
39
分享
相关文章
mybatis执行流程
mybatis执行流程
126 0
mybatis 执行流程(3)
开篇  这篇文章的主要目的是为了讲清楚Mybatis的整个执行流程,会通过源码、流程图等多个维度进行说明,相关的细节由于涉及面比较广这里暂时先不详细展开。
1378 0
MyBatis -- 执行流程
MyBatis的执行流程可以概括为: 读取核心配置文件 - 创建会话工厂 - 创建会话 - 将Mapper接口和Mapper映射文件做映射,获取Mapper实例对象 - 执行Mapper对象方法
165 0
MyBatis 执行流程及源码解析
MyBatis 执行流程及源码解析
136 0
MyBatis 执行流程及源码解析
MyBatis源码-解读Executor的三个实现类之ReuseExecutor(重用执行器)
MyBatis源码-解读Executor的三个实现类之ReuseExecutor(重用执行器)
192 0
mybatis源码解读(五)——sql语句的执行流程
  还是以第一篇博客中给出的例子,根据代码实例来入手分析。 1 static { 2 InputStream inputStream = MybatisTest.class.
1130 0
MyBatis源码-解读Executor的三个实现类之SimpleExecutor(简单执行器)
MyBatis源码-解读Executor的三个实现类之SimpleExecutor(简单执行器)
164 0
MyBatis源码-解读Executor的三个实现类之BatchExecutor(批处理执行器)
MyBatis源码-解读Executor的三个实现类之BatchExecutor(批处理执行器)
355 0

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等