Hibernate 主要 API

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();

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 本文包括: 1、CRM 项目的整体介绍 2、Hibernate 框架概述 3、Hibernate 快速入门 4、H...
    廖少少阅读 8,751评论 9 66
  • Hibernate: 一个持久化框架 一个ORM框架 加载:根据特定的OID,把一个对象从数据库加载到内存中OID...
    JHMichael阅读 6,094评论 0 27
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,219评论 18 399
  • (一)Struts、Spring、Hibernate、Mybatis框技术 1.Struts2.0有几种标签库 【...
    独云阅读 8,536评论 0 62
  • 人们常说,感情要走得远,两个人最好势均力敌。完全平等实属稀缺,但感情中的地位悬殊太大,累身累心,最终怕是只能一拍两...
    一只攒劲儿飞离的鸟阅读 3,584评论 0 0

友情链接更多精彩内容