关于Hibernate的一些学习心得总结

Hibernate是一个优秀的Java 持久化层解决方案,是当今主流的对象—关系映射(ORM)工具
 

对于Hibernate刚刚学习了一周时间了,作为一名java初学者,也有点自己的感受想分享出来,如果这篇文章能有幸被大家看到,也仅供大家娱乐。如果有什么不足之处,欢迎大家多多指点,多多批评。仅供参考,不喜勿喷。

前段时间刚学习了用JDBC来进行java和数据库的连接,来实现对数据的持久化操作和增删改查,但是学习完的感受就是JDBC过于繁琐,因为它无 法直接面对对象,开发效率地,代码又多,还重复,完全不符合java面向对象的思维模式。Hibernate的诞生算是给java程序员很好地解决了这个 问题,所以我们可以忘掉JDBC了,来看看Hibernate是如何实现java的持久化操作的。

Hibernate是一个优秀的Java 持久化层解决方案,是当今主流的对象—关系映射(ORM)工具。它的优势有三点,第一:它是一个开发源代码的对象关系映射框架;第二:对JDBC进行了非 常轻量级的对象封装, 简化了JDBC 繁琐的编码;第三:将JavaBean对象和数据库的表建立对应关系。ORM是持久化层的一种解决方案,它是将java中的类对象及相关属性和相关类与数 据库中的表及表的属性和键做相关的一一映射,来实现java对象和数据库的联系。下面我就来具体说说自己是如何学习Hibernate的。

一:hibernate入门
对 于搭建项目框架编写hibernate配置文件、实体映射文件我就不多说了。首先我们要先用Configuration接口来新建会话工厂,再从 SessionFactory(会话工厂)里获得会话实例(一般情况下,整个应用只有唯一的一个SessionFactory,它应该在应用初始化时被创 建),然后获取Session实例,用Session可以操作数据库和类中的对象,用Transaction接口的commit()和 roolback()方法来提交事务和回滚事物,用Query来对数据库实现查询(用SQL或HQL)。另外在对数据进行增删改查操作 时,Hibernate中的实体对象有三种对象:瞬时状态,持久状态,游离状态。状态不同,实现方法也不相同。大家可以自己慢慢体会。

二:关联映射
既然 Hibernate是关系映射工具,必然存在many-to-one,one-to-many,双向一对多,many-to-many关联。要实现这些操 作,首先实体之间要有关联关系,即通过一个对象持有另一个对象的实例。而在数据库的表中,表的主外键也能实现表与表的关联关系。然后我们就要把这些关联关 系在映射文件(hbm.xml)中体现出来。many-to-one是many的一端应持有one的一端的对象(引用),one-to-many是one 的一端应持有many端的对象集合,双向一对多就是同时配置了单向的一对多和单向的多对一,多对多关联则是将多对多转换成两个一对多,而且为中间表建立实 体类及映射文件,两个端点和中间端分别建立双向一对多关联。

三:HQL实用技术
Hibernate 支持两种主要的查询方式。HQL(Hibernate Query Languge,Hibernate 查询语言)查询是一种面向对象的查询语言,其中没有表和字段的概念,只有类、对象和属性的概念,HQL 是应用较为广泛的方式。Criteria 查询又称为“对象查询”,它用面向对象的方式将构造查询的过程做了封装。

HQL相比与SQL更符合java面向对象思维,也更加简单。HQL中没有表和字段的概念,只有类、对象和属性的概念。例如你要查询名字中带有 “Spring”的一本书,SQL:select  * from books where book_name like ‘%Spring%'     HQL :from Book b where b.name like 'Spring%' SQL中用到的是数据库中的表名books和字段book_name,而HQL中用到的是Book类名和Book的name属性,而Book类和 books表又是映射关系,所以相当于实现了数据库的操作。是不是更加形象呢?

Criteria 查询用的比较少,从Session中获取Criteria实例,设定限制方法(用到Restrictions常用的查询条件)。相当于把HQL语句转化成一个个方法来实现查询。看自己喜好吧,反正我是觉得HQL更实用一些吧。

四:HQL中的延迟加载和Hibernate高速缓存
HQL 和Criteria查询过程中都会延迟加载,有人觉得这是Hibernate的一个缺陷,我觉得这更像是Hibernate的高明之处。在得到一个 Session实例后,用Book为例,你用Session的get()方法得到一本Book,Book是主对象,而Book又有一个Type关联对象, 但是得到的Book对象不会加载Type关联对象,只有在你需要用到Type关联对象时才会强制加载Type关联对象,具体来说就是关联对象和关联集合的 默认加载计划是:延迟加载,即加载主对象时它们不会被立即加载,而是直到使用这些对象和集合时才发送SQL语句、获取数据、初始化对象和集合,而主对象的 属性默认是被立即加载的。当然这种方式也是可以强制改变的,在用Criteria查询时,你可以在实体类的映射文件中来添加 lazy = “false”  来强制加载。不过不建议这种方式,因为会造成不必要的资源浪费,效率也极低。如果需要,我们可以在编写代码时强制加载效果会更好一些。

总之,这种延迟加载策略会简化SQL语句,提高查询效率。根据不同的用户需要,也可以改变加载策略。

Hibernate缓存有一级缓存和二级缓存,对于一级缓存,其生命周期跟Session的生命周期一样,所以也可以将Hibernate一级缓存 称为Session缓存。Hibernate一级缓存是一个强制的高速缓存。通过get()方法(load()方法也类似),我们可以得到一级缓存数据, 再次查询就不需要get()方法了,直接查询数据对象就行。需要注意的是get()方法是通过id来加载的,而list()方法也会将查询结果放置在一级 缓存中,但是它不会去一级缓存中查找获取数据,原因是list()方法不是通过id加载的,还有iterate方法,例如: Iterator<Seeker> iter = session.createQuery(“from **").iterate();  该语句只把ID的值放到迭代器中,当遍历的时候,会根据ID的值再去数据库中查。并且该语句会产生N+1次查询。

至于二级缓存是由SessionFactory负责管理,所以也常将二级缓存称为SessionFactory缓存。主要适用于不太重要的数据,所以也没深入的了解。

一周的Hibernate课程学习就到此为止了,Hibernate的相关知识还很多,以后要多在实战项目中运用才能更好地体会。

时间: 2024-11-01 02:06:14

关于Hibernate的一些学习心得总结的相关文章

关于Hibernate的一些学习心得总结_java

对于Hibernate刚刚学习了一周时间了,作为一名java初学者,也有点自己的感受想分享出来,如果这篇文章能有幸被大家看到,也仅供大家娱乐.如果有什么不足之处,欢迎大家多多指点,多多批评.仅供参考,不喜勿喷. 前段时间刚学习了用JDBC来进行java和数据库的连接,来实现对数据的持久化操作和增删改查,但是学习完的感受就是JDBC过于繁琐,因为它无法直接面对对象,开发效率地,代码又多,还重复,完全不符合java面向对象的思维模式.Hibernate的诞生算是给java程序员很好地解决了这个问题,

羽毛读《seo实战密码》学习心得分享 为什么要做seo

看到A5对ZAC的采访文章<Admin5对话"seo每天一贴"zac:无心插柳柳成荫>,感觉受益匪浅.这是羽毛对zac前辈新书<seo实战密码-60天网站流量提高20倍>的第一篇阅读学习心得.为了方便大家阅读,正文中出现红色字体为原文重要内容,绿色字体为羽毛自己的心得,欢迎大家参与讨论.你的留言,是我写心得的强大动力.谢谢支持! 前人给了我们很多的宝贵经验和规律技巧,让我们在前行的道路上少走弯路,更快到达成功的彼岸;为此,向前辈致敬! 一.什么是SEO SEO是

calendar控件的学习心得

calendar|控件|心得 今天还继续在calendar控件里琢磨,看以下代码,(用来在calendar里显示日期标签): if d.isothermonth then c.controls.clear else dim strholiday,strformatstart,strformatend as string strholiday=holidays(d.date.month,d.date.day) strformatstart="<br><font color=red

Web开发学习心得5——Asp.net的设计思想

自从有了html与http,就有了浏览器与Web服务器,并有了Web应用,最初的交互模式是这样的: 开发学习心得5--Asp.net的设计思想-">该模式很好地运行了很多年.然而,随着计算机应用的发展,人们越来越不满足于只有静态内容的页面,而由某种机制动态产生html等代码的需求越来越迫切,于是,很多技术就应运而生,Asp.net就是这样一种技术.从本质上讲,Asp.net就是一种服务器端动态产生html.css.javascript等浏览器认识的代码的技术.Asp.net的交互模式如下:

Web开发学习心得6——HttpApplication管线研究

经过Asp.net设计思想的研究,我们对HttpApplication的管线已经有了一个本质的了解.所谓管线,实际上就是生产流水线,由一系列的步骤所组成,而HttpContext,就是这条流水线上待加工的产品.现在,我们来对这条生产流水线进行更进一步的了解. 首先请看ApplicationStepManager.BuildSteps方法. 开发学习心得6--HttpApplication管线研究-">1.ValidatePathExecutionStep:负责对请求的路径进行安全检查,禁止

Web开发学习心得4——CSS盒模式与排版

首先简单讲一下盒模式,所谓盒模式,是CSS看待元素的方式,CSS将每个单一的元素都看作一个盒子,如下图所示: 开发学习心得4--CSS盒模式与排版-">之所以叫它盒模式,是因为它跟我们日常生活中的盒子非常相似,这里不多说了.CSS中大部分的属性都是用来控制content的,比如width.height.color等:padding.border.margin都是可选的,其中,padding.margin表示的是一片空白区域,只能控制其大小,border是一个可见的边框,可以控制其边框样式.

转贴: wolfenstein工作室-eMule源代码学习心得

1, eMule源代码学习心得(1):eMule代码的总体风格和其它相关工程 eMule的官方首页上写着:2002年05月13日 一个叫做 Merkur 的人,他不满意原始eDonkey2000客户端并且坚信他能够做的更好,所以他开始制作.他聚集了其它开发人员在他的周围,并且eMule工程就此诞生. eMule是一个典型的MFC程序,它的图形界面等,已经和MFC紧紧融合到了一起.因此通常情况下它只能在windows平台下运行.有一些其它的工程,如aMule等,把它进行了移植,因此跨平台的功能要强

运维管理平台实现与学习心得

经过一段时间的学习,写了一个简单的运维管理平台小项目,先看看啥样吧! 下面说明下具体实现: 软件架构:HTML+CSS+Jquery+Bootstrap+Ajax+Python2.7+Django1.9+SaltStack+MySQL 功能描述: 数据可视化:采用百度开源的ECharts绘图,通过Python脚本每分钟统计Nginx日志分析PV/UV量写到数据库. 资产管理:采用SaltStack Restful API二次封装调用收集主机配置信息入库,并提供增删改查. 主机批量管理:也是调用S

我的MYSQL学习心得(十四) 备份和恢复

原文:我的MYSQL学习心得(十四) 备份和恢复 我的MYSQL学习心得(十四) 备份和恢复 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运算符 我的MYSQL学习心得(六) 函数 我的MYSQL学习心得(七) 查询 我的MYSQL学习心得(八) 插入 更新 删除 我的MYSQL学习心得(九) 索引 我的MYSQL学习心得(十) 自定义存储过程