引言
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" />
上面就是我们在利用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内部的执行过程:
当我们在执行对数据库的CRUD操作的时候大概就会经历上面的几个过程,然后将结果返回。下面我们再来分析代码和我们操作的对象的状态的改变以及在内存中的位置。
临时状态和脱管状态:
临时状态的对象肯定是从new创建来的
脱管状态的对象肯定是从持久化状态转化过来的
通过get方法在DB中获取的对象是持久化状态
分享一张状态转换图(游离状态也为托管状态)
持久化状态的对象可以通过session.save/update/get方法把一个对象变成持久化对象变成持久化状态的对象只说明该对象进入了hibernate的区域和数据库没有关系,和数据库有关系的只有事务脱管状态的对象可以通过session.close/evic/clear方法是对象为托管状态。
小结
上面的博文就是在小编初始hibernate的时候对代码执行和内部机制的一些分析,通过分析和比较好的认识hibernate的内部运转机制,为以后更深入的了解hibernate做基础。