1.Hibernate主键生成策略
自然主键:把具有业务含义的字段作为主键,称之为自然主键。例如在customer表中,如果把name作为主键,其前提条件必须是:每一个客户的姓名不允许为null,不允许客户重名,且不允许修改客户姓名。
代理主键:把不具备业务含义的字段作为主键,称之为代理主键。该字段一般取名为“id”,通常为整数类型。
Hibernate的主键生成策略
2.Hibernate的持久化对象的三种状态
hibernate为了更好的来管理持久化,特将持久化类分成了三种状态,分别是瞬时态、持久态和托管态。
1)瞬时态:瞬时态的实例是由new命令创建、开辟内存空间的对象,不存在持久化标识OID(相当于主键值),尚未与Hibernate Session关联,在数据库中也没有记录。
2)持久态:持久态的对象存在持久化标识OID中,并且加入到了Session缓存中,并且相关联的Session没有关闭,在数据库中有对应的记录。
3)托管|游离态:当某个持久化状态的实例与Session的关联被关闭时就变成了托管态。托管态对象存在持久化标识OID,并且与数据中的数据存在关联,只是失去了与当前Session的关联。
3.Hibernate的一级缓存
Hibernate的一级缓存就是指Session缓存,Session缓存是一块内存空间,用来存放相互管理的java对象,在使用Hibernate查询对象的时候,首先会使用对象属性的OID值在Hibernate 的一级缓存中进行查找,如果找到匹配OID的值,就直接将该对象从一级缓存中取出使用,不会再查询数据库,如果没有找到就回去数据库中查找数据。当从数据库中查找到该数据时,也会把该数据信息放到一级缓存中。Hibernate 的一级缓存的作用就是减少对数据库的访问次数。
Hibernate的一级缓存有如下特点:
- 当应用程序调用Session接口的save()、update()、saveOrUpdate()时,如果Session缓存中没有对应的对象,Hibernate就会自动的把从数据库中查询到的相应对象的信息加入到一级缓存中。
- 当调用Session接口的load()、get()方法,以及Query接口的list()、iterator()方法时,会判段该缓存中是否存在该对象,有则返回,没有则去数据库查询再加入一级缓存中。
- 当调用Session的close()方法时,Session缓存会被清空。
4.Hibernate的事务控制
事务的四个特性:(ACID)
- 原子性(Atomic):表示将事务中所做的操作捆绑成一个不可分割的单元。即对事务进行的增删改查操作,都要同时执行或者不执行。
- 一致性(Consistency):事务完成时,必须使所有的数据保持一致状态。
- 隔离性(Isolation):指一个事务的执行不能被其他事务干扰。
- 持久性(Durablity):指一个事务一旦提交,它对数据库中数据的改变就该是永久性的。
事务的并发问题
- 脏读:一个事务读取到另一个事务未提交的数据
- 不可重复读:一个事务读到了另一个事务已经提交的update的数据,导致在同一个事务中的多次查询结果不一致
- 虚读/幻读:一个事务读到了另一个事务已经提交的insert数据,导致在同一个事务中的多次查询结果不一致
事务的隔离级别
5.Hibernate的查询语句方法
5.1HQL语句
一般步骤
(1)获得Hibernate的Session对象
(2)编写Hql语句
(3)调用Session createQuery创建查询对象
(4)如果Hql语句包含参数,则调用Query的setXXX设置参数
(5)调用Query对象的list()或uniqueResult()方法执行查询
query的api方法:
- list方法:List<泛型> list=query.list(),用于返回多条记录的结果
- uniqueRseult()方法:该方法用于返回唯一的结果,在确保只有一条记录的查询时可以使用该方法
- setFirstResult()方法:该方法可以设置获取第一个记录的位置,也就是它表示从第几条记录开始查询,默认从0开始
- setMaxRseult()方法:该方法用于设置结果集的最大记录数,通常与setFirstResult()方法结合使用,用于限制结果集的范围,以实现分页功能
5.2Criteria
criteria是一个完全面向对象、可扩展的条件查询API,通过它完全不需要考虑数据库底层如何实现,以及sql语句如何编写,它是Hibernate的核心查询对象,又被称为QBC查询。Criteria的一般步骤如下:
- 获得Hibernate的Session对象
- 通过Session获得Criteria对象
- 使用Restrictions的静态方法创建Criteria条件对象
- 向Criteria对象中添加Criteria查询条件。Criteria的add()方法用于加入查询条件
- 执行Criteria的list或者uniqueResult获得结果
6.表与表的关系分析
一对多:建表原则——在多的以方创建外键指向一的一方的主键
多对多:建表原则——创建一个中间表,中间表至少两个字段作为外键分别指向多对多双方的主键
数据库建表能够描述实体数据之间的关系,通过对象也可以进行描述,所谓的关联映射就是将关联关系映射到数据库中,在对象模型中就是一个或多个引用。在Hibernate中采用java对象关系来描述数据表之间的关系,具体如图所示:
7.Hibernate的多表关系实际操作
一对多/多对一
O 对象 一的一方使用集合. 多的一方直接引用一的一方.
R 关系型数据库 多的一方使用外键引用一的一方主键.
M 映射文件 一: <set name="">
<key column="" />
<one-to-many class="" />
</set>
多: <many-to-one name="" column="" class="" />
操作: 操作管理级别属性.
cascade: 级联操作
减少我们书写的操作代码.
none(默认值) 不级联
save-update: 级联保存
delete: 级联删除
all: 级联保存+级联删除
结论: 可以使用save-update.不推荐使用delete. 也可以不用cascade.
inverse: 反转关系维护
属于性能优化.关系的两端如果都书写了关系.那么两方都会发送维护关系的语句.
这样,语句就发生重复.我们可以使用inverse使一的一方放弃维护关系.
true 放弃
false(默认值) 维护
结论: 在一对多中,一的一方可以放弃维护关系.
多对多
O 对象 两方都使用集合.
R 关系型数据库 使用中间表.至少两列.作为外键引用两张表的主键.
M 映射文件 多: <set name="" table="中间表名" >
<key column="别人引用我" />
<man-to-many class="" column="我引用别人的" />
</set>
操作:操作管理级别属性.
cascade: 级联操作
减少我们书写的操作代码.
none(默认值) 不级联
save-update: 级联保存
delete: 级联删除
all: 级联保存+级联删除
结论: 可以使用save-update.不推荐使用delete. 也可以不用cascade.
inverse: 反转关系维护
属于性能优化.必须选择一方放弃维护主键关系.哪方放弃要看业务方向.
8.QBC检索方式详细介绍
QBC检索方式的一般过程如下所示
QBC检索是使用Restrictions对象编写查询条件的,在Restrictions类中提供了大量的静态方法来创建查询条件,常用的方法如下表所示
基本检索
条件检索
分页检索
排序检索
统计检索
离线条件检索
DetachedCriteria翻译为离线条件查询,它是一种可以脱离Session来使用的条件查询对象。我们都知道Criteria对象必须由Session对象来创建,那么也就是说必须先有Session才可以生成Criteria对象。而DetachedCriteria对象可以在其他层对条件进行封装。它的有点主要是在做一些比较复杂的查询的时候,往往会在web层向业务层传递很多参数,业务层又会将这些参数传递给DAO层,最后在DAO中拼接sql完成查询。有了离线条件查询对象后,这些工作都可以不用关心了,我们可以在web层将数据就封装好。
9.HQL的查询语法
基础语法:
排序检索:
条件检索:
分页检索:
聚合查询:
投影查询:
多表查询:
内连接:
左外连接:
右外连接: