热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

关于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 iter = session.createQuery(“from **").iterate();  该语句只把ID的值放到迭代器中,当遍历的时候,会根据ID的值再去数据库中查。并且该语句会产生N+1次查询。

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

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


推荐阅读
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了通过mysql命令查看mysql的安装路径的方法,提供了相应的sql语句,并希望对读者有参考价值。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Oracle10g备份导入的方法及注意事项
    本文介绍了使用Oracle10g进行备份导入的方法及相关注意事项,同时还介绍了2019年独角兽企业重金招聘Python工程师的标准。内容包括导出exp命令、删用户、创建数据库、授权等操作,以及导入imp命令的使用。详细介绍了导入时的参数设置,如full、ignore、buffer、commit、feedback等。转载来源于https://my.oschina.net/u/1767754/blog/377593。 ... [详细]
  • mysql-cluster集群sql节点高可用keepalived的故障处理过程
    本文描述了mysql-cluster集群sql节点高可用keepalived的故障处理过程,包括故障发生时间、故障描述、故障分析等内容。根据keepalived的日志分析,发现bogus VRRP packet received on eth0 !!!等错误信息,进而导致vip地址失效,使得mysql-cluster的api无法访问。针对这个问题,本文提供了相应的解决方案。 ... [详细]
  • ubuntu用sqoop将数据从hive导入mysql时,命令: ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
author-avatar
Carol卍_932
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有