hibernate最全面总结

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Hibernate总结

1201fdteam陈玉龙

1、hibernate简介

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。Hibernate可以应用在任何使用JDBC的场合。他的主要作用就是将对象持久化。

对象持久化的必要性:内存是暂时存储介质,数据容易丢失,并且容量小,无法存储大数据量。

2、hibernate的步骤

一共分为七个步骤:

1、读取并解析配置文件,开启一个配置实例

2、读取并解析映射信息,创建SessionFactory

3、打开session实例

4、创建事务Transaction

5、进行CRUD操作

6、提交事务commit

7、关闭Session实例及SessionFactory

在配置信息里,我们的主键生成与普通属性的生成不一样,必须选择策略,主键的

生成策略有10多种,还可以自定义,常用的有以下几种:

1、assigned主键由外界程序生成

2、identity采用数据库提供的主键生成机制

3、native由hibernate根据数据库自行判断使用哪种机制

4、uuid.hex生成字符串为32位的数据作为主键

3、hibernate的状态管理

Hibernate中的pojo有三种状态:瞬时态、持久态和游离态(脱管态)

瞬时态的时候,pojo和session无关,数据库中也没有该记录。在Hibernate 中,可通过session 的save()或saveOrUpdate()方法将瞬时对象与数据库相关联,并将数据对应的插入数据库中,此时该瞬时对象转变成持久化对象。

持久状态时,pojo和session有关,数据库中有该记录。如果是用hibernate 的delete()方法,对应的持久对象就变成瞬时对象,因数据库中的对应数据已被删除,该对象不再与数据库的记录关联。当一个session 执行close()或clear()、evict()之后,持久对象变成脱管对象,此时持久对象会变成脱管对象,该对象不在Hibernate 持久层的管理之下。

脱管状态时,pojo与session无关,但是数据库中有该记录。当脱管对象被重新关联到某个session 上时,并再次转变成持久对象。脱管对象可通过update()、saveOrUpdate()等方法,转变成持久对象。

4、hibernate的三种查询方式

(1)HQL(Hibernate Query Language)

HQL是Hibernate官方推荐的Hibernate检索方式,它使用类似SQL的查询语言,以面向

对象的方式从数据库中查询。它的查询方法大体分为两种:冒号法和问号法。执行的过程与sql类似,通过设置条件返回一个结果list。

(2)QBC(Query By Criteria)

QBCAPI提供了检索对象的另一种方式,它主要有Criteria接口、Criterion接口和Expresson类组成,它支持在运行时动态生成查询语句。

QBE(Query By Example)是QBC的一种,原理是先创建一个对象,此对象的某些属性的值已经确定,以这些属性作为条件来检索对象。

(3)SQL

1、采用addScalar方法一个字段一个字段指定类型。

2、采用addEntity方法将对象作为条件指定进去。

不管是那种查询方式,如果查询的不是对象而是对象中的某个属性,那么返回不是一个封装好的对象,而是一个list。List又分为两种情况,如果只有一个字段,则list中的每一个元素都是一个对象,如果不止一个字段,则需要自己遍历list,将list中的元素封装到对象中,自己构建对象。

三种查询方式的优缺点:

HQL功能最为强大,适合大多数情况,缺点是动态条件查询构造不方便;

QBC最适合动态条件查询,缺点是不适合统计查询,功能不完善,只能用于简单的查询;

SQL可以实现特定数据库的查询,缺点是丢失了可移植性。

5、hibernate的映射

主要的映射关系有1-1,1-N,N-N。

(1)1-1

单向外键映射

事实上,单向1-1和N-1的实质是相同的,1-1是N-1的特例,他们的映射配置也十分类似。只需要在N-1中的配置里添加唯一性标记,则成了单向1-1,例如:

,这里的字段可写可不写,不写则默认的与name一样。

双向外键映射

除了指定该语句

之外,还需要再对方映射关系中指定 这里的property-ref指定的值(name)所对应的列(column)就是由本对象关联查询相关对象时的条件,不指定时默认是对方的主键。

需要注意一点的是,property-ref并不是什么时候都起作用,具体在哪些情况下不起作用,还有待测试。

单向主键映射

1-1的关联可以基于主键关联,但是基于主键关联的持久化类不能拥有自己的主键生成策略,它的主键是由关联类负责生成的,例如

对象属性名

相关文档
最新文档