Configuration 接口
该接口的作用是加载配置文件及映射文件,以实现对 Hibernate 的启动,Configuration 实例调用 Configuration 实例调用 buildSessionFactory 方法便可创建一个 Session 工厂 SessionFactory 对象
Configuration cfg = new Configuration().configure();
new Configuration() 会加载一个属性文件 hibernate.properties。该属性文件中存放数据连接配置、Hibernate 配置等配置信息。一般情况下不用设置该属性文件,其设置已经放到了主配置文件中。若要设置,应将其放于 src 目录下。赶文件的模板存放于 Hibernate 框架解压目录下的 project/etc 下。
configure() 方法,用于加载和解析 hibernate.cfg.xml 配置文件及映射的 Configuration 对象。
SessionFactory 接口
SessionFactory 接口对象是有 Conffiguration 对象通过 buildSessionFactory() 方法创建。创建对象的目的是,用于开启 Session 对象。
SessionFactory factory = cfg.buildSessionFactory();
SessionFactory 对象特点
重量级对象(系统开销大)、单例的、线程安全的。
SessionFactory 对象的使用原则
基于其是线程安全的重量级对象,其创建销毁是系统开销大,又是单例的特点,SessionFactory 对象一般不手动关闭,而是在应用解说时自动将其销毁。因此,SessionFactory 不用进行 close() 关闭。
Session 接口
Session 接口是应用程序与 HIbernate 连接的核心 API, 是 Hibernate 向应用程序提供的操作 DB 的主要接口。它提供了基本的保存、更新、删除与查询方法。由 SessionFactory 对象创建。
Session session = factory.openSession();
Session 对象的特点
一个轻量级对象、线程不安全、多例的。
在 Web 应用程序中,多个用户对统一应用访问, Hibernate 会为了每个用户创建一个 Session 对象。所以是多例的。Session 中包含大量非 final 成员变量,对于同一个用户的操作,可能会产生多个事务,这多个事务若同时对一个 Sesssion 的统一成员变量进行访问,就会引起并发问题。所以 Session 是线程不安全的。
Session 对象的使用原则
基于 Session 的以上特点,Session 在使用时做到一个线程一个 Session,即一个事务一个 Session。使用完毕,立即关闭。Session 不要作为某个类的成员变量出现,因为这样会出现多个实例对象对同一个 Session 的共享,使其更不安全。
Session 对象的获取
为了保证一个线程一个 Session,即一个线程中使用的 Session 是同一个对象,一般在获取 SessIon 对象,需要在主配置文件中对 Session 所处的上下文环境,即事务环境进行注册。
其取值方式有三种
|取值|意义|
|::|::|
|thread|表示当前 Session 所处的环境为本地事务环境,Session 会与当前线程绑定|
|jta|表示当前 Session 所处的环境为分布式事务环境|
|SpringSessionContext类|SSH 集合时使用|
使用 getCurrentSession()方法获取的 Session,在进行事务提交或回滚后,会自动关闭, 无需再手工进行 close()。
两种获取 Session对象方式的区别
获取 Session 对象,可以使用 openSession()方式,也可以使用 getCurrentSession()方式。 这两种方式在本质上有着很大的区别。
||getCurrentSession()方式|openSession()方式 |
|:--:|:--:|::|
|获取的对象 |无论执行多少次该方法,只要是 在同一线程中,获取的都是同一 个 Session对象|每执行一次该方法,获取到的 都是一个新的 Session 对象|
|对象的关闭|自动关闭 Session,无需手工关闭|必须手工关闭 Session 对象 |
|环境的注册|需要注册 Session 的运行环境|无需注册 |
|查询对事务 的支持 |查询必须在事务内执行|查询可以不在事务内执行|
Session 的常用方法
|方法|备注|
|::|::|
|save()|添加对象,Hibernate 的 API |
|persist()|添加对象,属于 JPA 的 API ,而 Hibernate 属于 JPA 的实现|
|delete()| 删除对象|
|update()|修改对象|
|saveOrUpdate()|根据主键来判断是否存在对象,有则更新,没有则创建|
|get()|若获取对象为 null 没有异常|
|load()|若获取对象为 null 则抛出异常
Transaction 接口
通过该接口,可以将事务从持久层,提升到业务层。由 Session 对象创建 session.getTransaction();
事务的开启:session.beginTransaction(); 或 session.getTransaction().begin();
事务的提交:session.getTransaction().commit();
事务的回滚:session.getTransaction().rollback();
网友评论