hibernate最全面总结
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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,例如:
双向外键映射
除了指定该语句
需要注意一点的是,property-ref并不是什么时候都起作用,具体在哪些情况下不起作用,还有待测试。
单向主键映射
1-1的关联可以基于主键关联,但是基于主键关联的持久化类不能拥有自己的主键生成策略,它的主键是由关联类负责生成的,例如
对象属性名