Hibernate 是一个能够将JavaBean对象和数据库的表建立对应关系的映射框架,它通过对JDBC进行对象封装,最终实现面向对象的数据持久化。ORM是hibernate持久化的一种解决方案,是把对象模型和关系型数据库关系模型映射起来,主要表现为:类和表的映射;属性和主键的映射;属性和普通字段的映射,并且使用原始数据对这些映射进行描述。
一、hibernate的核心接口
在使用hibernate之前,我们首先要了解它经常使用的接口。
1、Configuration接口:Configuration对象用来配置和引导Hibernate,一个Hibernate使用一个Configuration实例来指定主配置文件的位置。
2、SessionFactory接口(重量级,单实例):因为创建它的代价较大,一个应用只能有一个SessionFactory,所以应把它设为静态变量,并在应用初始化时被创建。
3、Session接口:它被称为持久化管理器,Session实例是轻量级的,会为每一个事物创建一个Session实例,并在使用之后关闭它。它主要有save()、get()、update()、delete()(数据的保存、获取、更改和删除)
4、Transaction接口:是对实际事物的一个抽象,主要定义了commit()和rollback()两个方法。
5、Query接口:允许在数据库上执行查询,查询使用HQL或SQL。Query实例可用来绑定查询参数,限定查询返回的结果数,并且最终执行查询。
二、Hibernate中实体对象的三种状态及转换
1、瞬时状态:刚用new语句创建,还没有被持久化,且不处于Session的缓存中。通过save()、saveOrupdate()方法转换为持久态。
2、持久状态:已经被持久化,且加入到Session的缓存中。Session的get()、load()方法可以直接获得一个持久态,Session关闭之后,原有的持久态就变成了游离态;而通过delete()方法可转变为瞬时态。
3、游离状态:已经被持久化,但不再处于Session的缓存中。游离态可以通过update()、save()方法重新回到持久态。
持久态与游离态的共同点在于:都有数据表的一行与之对应。
三、Hibernate的关联映射
1、单向多对一关联(many-to-one)
many的一端应持有one的一端的对象(引用);映射文件体现多对一;关联操作
映射文件例:
<hibernate-mapping>
<class name="org.ijob.bean.Resume" table="ijob_resume">
<!—省略主键映射及属性映射 -->
<!-- 多对一关联 -->
<many-to-one name="seeker" class="org.ijob.bean.Seeker">
<column name="seeker_id"></column>
</many-to-one>
</class>
</hibernate-mapping>
2、单向一对多关联(one-to-many)
one的一端应持有many端的对象集合;映射文件体现一对多;关联操作
映射文件例:
<hibernate-mapping>
<class name="org.ijob.bean.Seeker" table="ijob_seeker">
<!—省略主键映射及属性映射 -->
<set name="resumes" >
<key column="seeker_id"></key>
<one-to-many class="org.ijob.bean.Resume"/>
</set>
</class>
</hibernate-mapping>
3、一对一关联
一对一关联是特殊的一对多关联,many的一端是唯一的而不是多个。有以下两种实现方法:
<many-to-one name="resume" class="org.ijob.bean.Resume" column="resume_id" unique="true" />
<one-to-one name="purpose" class="org.ijob.bean.Purpose" property-ref="resume" />
4、多对多关联
将多对多转换成两个一对多;为中间表建立实体类及映射文件,两个端点和中间端分别建立双向一对多关联
如果中间表是联合主键:
<!-- 联合主键 -->
<composite-id>
<key-many-to-one name=“**” column=“***" class=“***" ></key-many-to-one>
<key-many-to-one name=“**” column=“**" class=“**" ></key-many-to-one>
</composite-id>
四、HQL查询和Criteria查询
它们是hibernate查询支持的两种方式。
HQL查询:
HQL是一种面向对象的查询语言,其中没有表和字段的概念,只有类、对象和属性的概念。
1、使用HQL的步骤
得到Session
编写HQL语句
创建Query对象:Query接口是HQL 查询接口。它提供了各种的查询功能
执行查询,得到结果
2、HQL基本语法
# 选择:与SQL的基本相同:都是使用where 子句指定限定条件;通过与SQL 相同的比较操作符指定条件,如: =、<>、<、>、>=、<=、between、not between、in、not in、is、like;通过and、or 等逻辑连接符组合各个逻辑表达式。
# 投影:选择出现在结果集中的字段,默认情况下结果为对象数组组成的集合。
# 通用查询参数绑定方法:参数绑定有两种方法,分别是利用定位参数(从0开始计数)和利用命名参数。Query接口提供多个设置参数的方法,用来绑定大多数Hibernate内建类型的参数,例如setInteger()、setTimestamp()、setLocale() 等。setParameter()方法允许绑定任何hibernate类型实参。
#分页:query.setFirstResult(i)(参数是开始获取对象的行数,从0开始编号);
query.setMaxResults(n)(参数是获取对象的数目)
#分组函数:组函数有count()、min()、max()、sum()和avg(),其含义和SQL中定义的一样。
Criteria查询
Criteria查询(对象查询),它用面向对象的方式将构造查询的过程做了封装。
1、 查询语句如下:Criteria criteria = session.createCriteria(**.class);
List users = criteria.list();
2、使用Criteria.add()方法设定查询条件,使用Restrictions的各种静态方法传回 ,使用Criteria.addOrder(order.asc())对结果进行排序。
五、使用Hibernate完成增删改的步骤:
1、创建hibernate配置文件,默认文件名为hibernate.cfg.xml,包括四个部分的内容:数据库连接信息;Hibernate相关特性;连接池相关配置;实体类映射文件的路径
2、创建实体类
3、创建和配置映射文件
4、将映射文件添加到主配置文件中
5、进行测试
6、数据库操作,包括7个步骤:添加Configuration配置;创建SessionFactory;打开Session ;开始一个事务;持久化操作(save/update/delete/get);提交事务;关闭Session
六、Hibernate的延迟加载
延迟加载是指:主对象的关联对象和关联集合并不是立即抓取的,加载主对象时,它们还是一个代理,只有需要使用到这些对象时,才会对它们加载。
涉及到加载计划(何时加载)的关注点有以下几个:
主对象的关联对象何时被加载;
主对象的关联集合何时被加载;
主对象本身何时被加载;
主对象的属性何时被加载。
对于关联对象和关联集合,默认情况下Hibernate会采用延迟加载,它是按需加载;
对于主对象本身,它是否延迟加载取决于使用的方法,load()方法会延迟加载,得到代理对象,只有使用时才会触发查询的发生,而get()方法是立即获取对象本身。
对于主对象的属性,它在默认情况下是被立即加载的。