Hibernate框架的工作流程
1.通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件。
2.由hibernate.cfg.xml中的<mapping resource="com/xx/User.hbm.xml"/>读取并解析映射信息。
3.通过config.buildSessionFactory();创建SessionFactory。
4.SessionFactory.openSession();打开Session。
5.session.beginTransaction();创建事务Transaction。
6.使用session对象的具体方法完成持久化操作。
7.session.getTransaction().commit();提交事务
8.关闭session。
9.关闭SessionFactory。
Hibernate是一个开源的ORM框架,在很多程度上弥补了JDBC的不足,但对于数据量较大或者是表关系比较复杂的情景,hibernate还是有很多弊端的,因为hibernate的底层也是对JDBC的操作,所以也会生成SQL语句,但是在生成SQL语句的时候不会考虑性能。
加载流程:
@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的内部执行流程:
@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内部的执行过程:
代码和操作对象的状态的改变以及在内存中的位置。
临时状态和脱管状态:
临时状态的对象肯定是从new创建来的。
脱管状态的对象肯定的从持久化状态转化过来的。
通过get方法在DB中获取的对象是持久化状态。
状态转换图:
持久化状态的对象: 可以通过session.save/update/get方法把一个对象变成持久化对象,变成持久化对状态的对象只说明该对象进入了Hibernate的区域和数据库没有关系,和数据库有关系的只有事务。
脱管状态的对象(也称为游离状态):可以通过session.close/evic/clear方法使对象为脱管状态。