浅谈Hibernate

分享人:韩亚博

1.背景介绍

2.知识剖析

3.常见问题

4.编码实战

5.扩展思考

6.参考文献

7.更多讨论

1.背景介绍

2001年,澳大利亚墨尔本一位名为Gavin King的27岁的程序员,上街买了一本SQL编程的书,他厌倦了实体bean,认为自己可以开发出一个符合 对象关系映射 理论,并且真正好用的Java持久化层框架,因此他需要先学习一下SQL。这一年的11月,Hibernate的第一个版本发布了。

持久化层框架

2.知识剖析

2.1 Hibernate是什么?能做什么?

2.2 核心API

2.1 Hibernate是什么?能做什么?

Hibernate是一个开放源代码的对象关系映射框架,

它对JDBC进行了非常轻量级的对象封装,

它将POJO与数据库表建立映射关系,

是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,

使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。

Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用。

2.2 核心API

Hibernate的API一共有6个,分别为:Session、SessionFactory、Transaction、Query、Criteria和Configuration。通过这些接口,可以对持久化对象进行存取、事务控制。

Session

Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句)。Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSession对象称为用户session。

SessionFactory

SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。

Transaction

Transaction 接口是一个可选的API,可以选择不使用这个接口,取而代之的是Hibernate的设计者自己写的底层事务处理代码。Transaction接口是对实际事务实现的一个抽象,这些实现包括JDBC的事务、JTA中的UserTransaction、甚至可以是CORBA事务。之所以这样设计是能让开发者能够使用一个统一事务的操作界面,使得自己的项目可以在不同的环境和容器之间方便地移植。

Query

Query接口让你方便地对数据库及持久对象进行查询,它可以有两种表达方式:HQL语言或本地数据库的SQL语句。Query经常被用来绑定查询参数、限制查询记录数量,并最终执行查询操作。

Criteria

Criteria接口与Query接口非常类似,允许创建并执行面向对象的标准化查询。值得注意的是Criteria接口也是轻量级的,它不能在Session之外使用。

Configuration

Configuration 类的作用是对Hibernate进行配置,以及对它进行启动。在Hibernate的启动过程中,Configuration类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactory对象。虽然Configuration类在整个Hibernate项目中只扮演着一个很小的角色,但它是启动hibernate 时所遇到的第一个对象。

3.常见问题

缓存

Session

缓存

一级缓存(session级别),缓存只停留在这个session中,如果session关闭或者其他session需要这些数据,都是不能从缓存中取出来的

二级缓存(sessionFactory级别),就算某个session(第一次需要去数据库查数据的session)关闭了,仍旧不影响缓存中数据的取用

一级缓存默认开启,二级缓存需要配置以及第三方支持

Session

Hibernate有两种方式获得session,分别是:openSession和getCurrentSession

1. 获取的是否是同一个session对象

2. 事务提交的必要性

获取的是否是同一个session对象

openSession每次都会得到一个新的Session对象

getCurrentSession在同一个线程中,每次都是获取相同的Session对象,但是在不同的线程中获取的是不同的Session对象

事务提交的必要性

openSession只有在增加,删除,修改的时候需要事务,查询时不需要的

getCurrentSession是所有操作都必须放在事务中进行,并且提交事务后,session就自动关闭,不能够再进行关闭

4.编码实战

缓存对比

Session对比

语句对比

语句对比

HQL(Hibernate Query Language)是hibernate专门用于查询数据的语句,有别于SQL,HQL 更接近于面向对象的思维方式。

Criteria,与HQL和SQL的区别是Criteria 完全是 面向对象的方式在进行数据查询,将不再看到有sql语句的痕迹

Hibernate依然保留了对标准SQL语句的支持,在一些场合,比如多表联合查询,并且有分组统计函数的情况下,标准SQL语句依然是效率较高的一种选择

5.扩展思考

hibernate应用场景

对于数据量大,性能要求高系统,不太使用hiberante。主要用于事务操作比较多的项目OA/某个行业软件(石油、税务、crm, 财务系统。)

6.参考文献

https://baike.baidu.com/item/Hibernate/206989?fr=aladdin

http://how2j.cn/k/hibernate/hibernate-tutorial/31.html

7.更多讨论

分享到此结束

欢迎大家讨论