- 配置对象Configuration
作用:读取配置文档:Hibernate.cfg.xml; - 创建SessionFactory对象
作用:读取相应的里面加载的对象关系映射文件 - 创建session文件
作用:类似于JDBC中的Connection,这个session对象等同于连接对象
执行增删改查:save,delete,update,createQuery等。 - 执行某个session对象的方法的时候,必须开启一个事物transaction,这些方法需要封装在事物当中。
- 执行完成方法之后,需要提交事务并且关闭session
transaction.commit();
session.close();
session与connection是多对一的关系,每个session都有一个与之对应的connection,一个connection不同时刻可以供多个session使用。
Configuration类(管理Hibernate的配置信息)
Configuration 类负责管理 Hibernate 的配置信息。包括如下内容:
- 加载hibernate.properties 和 hibernate.cfg.xml
- 持久化类与数据表的映射关系(*.hbm.xml文件)
创建Configuration 的两种方式:
-
属性文件(hibernate.properties):
Configuration cfg = new Configuration(); //手动加载hbm -
Xml文件(hibernate.cfg.xml)
Configuration cfg = new Configuration().configure();
在核心配置文件中引入映射配置文件:
- 之前做法:
<!-- 引入映射配置文件 -->
<mapping resource="com/meng/entity/Users.hbm.xml" />
- 还有另外方式加载映射配置文件(了解)
SessionFactory接口(获取Session对象)
Configuration对象根据当前的配置信息生成SessionFactory对象
- SessionFactory对象中保存了当前数据库配置信息和所有映射关系以及预定义的SQL语句
- SessionFactory对象是线程安全的
- SessionFactory还负责维护Hibernate的二级缓存
Configuration configuration = new Configuration().configure();
创建sessionFactory
SessionFactory sessionFactory = configuration.buildSessionFactory();
可以通过SessionFactory对象 获得Session对象
Session session = sessionFactory.openSession();
或者
Session session = sessionFactory.getCurrentSession();
openSession与getCurrentSession的区别
- openSession 每次使用都是创建一个新的session;getCurrentSession 是获取当前session对象,连续使用多次时,得到的session都是同一个对象。
- getCurrentSession在事物提交或者回滚之后会自动关闭;而openSession需要手动关闭,如果使用openSession而没有手动关闭,多次使用之后会导致连接池溢出。
- 一般在实际开发中,往往使用getCurrentSession多,因为一般是处理同一个事务,所以在一般情况下比较少使用openSession。
构造SessionFactory 很消耗资源,一般情况下一个应用只初始化一个
Session接口(CRUD操作)
- 调用Session里面的方法,实现crud操作。
- Session是单线程对象,只能有一个操作时候,不能同时多个操作使用,不要把Session变量定义成成员变量,每次使用都创建新对象,相当于JDBC的Connection。
- Session是应用程序与数据库之间交互操作的一个单线程对象,是 Hibernate 运作的中心;Session是线程不安全的。
- 所有持久化对象必须在Session 的管理下才可以进行持久化操作。
- Session 对象有一个一级缓存,显式执行 flush 之前,所有的持久化操作的数据都缓存在 session 对象处。
- 持久化类与 Session 关联起来后就具有了持久化的能力。
常用方法
Transaction接口(事务)
代表数据库操作的事务对象
- hibernate对数据库的操作都是封装在事物transaction当中,并且默认是非自动提交的方式,所以用session保存对象时,若不开启事务,并手工提交事务,对象时不会保存到数据库当中的。
- 如果你想让Hibernate向jdbc那样自动提交事务,可以不开启事物,用session的doWork()方法,并设置自动提交事务,在保存对象之后,记得用session.flush();来输出SQL语句,不然对象也是不会保存到数据库中的。但一般是不建议用第二种方法,都是用事物来封装对数据库的操作。
Session session = sessionFactory.getCurrentSession(); // 写添加逻辑 // 项数据库设置值 Users user = new Users(); user.setUsername("siru"); user.setPassword("654123"); session.doWork(new Work() { @Override public void execute(Connection connection) throws SQLException { connection.setAutoCommit(true); } }); session.save(user); session.flush();
开启事务
Transaction transaction = session.beginTransaction();
提供事务管理的方法:
- commit(): 提交相关联的session实例
- rollback(): 撤销事务操作
- wasCommitted(): 检查事务是否提交
网友评论