前言

从本节我们开始进入到对于Hibernate框架的学习,当前Hibernate框架还未正式发布6.0稳定版本,所以这里我们以5.4.12Final版本进行讲解。

Hibernate框架

Hibernate是一个对象/关系映射(ORM)解决方案, 对象关系映射或对象关系管理是将应用程序域模型对象映射到关系数据库表的编程技术,它是基于Java的ORM框架,用于将应用程序域对象映射到关系数据库表,Hibernate提供了对Java Persistence API(JPA)的实现或提供程序以及自身所提供的API,使其成为具有松散耦合优势的ORM工具的绝佳选择,我们可以利用Hibernate的持久性API用于CRUD操作,同时Hibernate框架也提供了一个选项,可以使用JPA注解以及基于XML的配置将POJO对象映射到关系数据库表。Java Persistence API(JPA)提供了用于管理应用程序中的关系数据的规范,JPA规范是通过javax.persistence包中的注解而定义的,使用JPA注解有助于我们编写独立于实现的代码,Hibernate通过使用JDBC与数据库进行交互。以下是Hibernate架构示意图:

Hibernate作为ORM解决方案,它作为Java应用程序数据访问层和关系数据库之间的桥梁,Java应用程序利用Hibernate API来加载,存储,查询等等其域数据。 作为JPA提供程序,Hibernate实现Java Persistence API规范,我们可以在下图中直观地看到JPA接口与Hibernate特定实现之间的关联:

SessionFactory (org.hibernate.SessionFactory)

应用程序域模型到数据库的映射的线程安全(且不可变)表示形式。它作为org.hibernate.Session实例的工厂,EntityManagerFactory和JPA的SessionFactory等效,此二者最终还是会会聚到同一个SessionFactory实现中,创建一个SessionFactory的开销非常大,因为SessionFactory维护所有Session中使用的服务,例如二级缓存,连接池,事务系统集成等,所以,对于任何给定的数据库,该应用程序应该仅具有一个关联的SessionFactory。

Session (org.hibernate.Session)

单线程且作为短生命周期对象在概念上为“工作单元”建模。它通过JPA中的EntityManager而表示,在背后,Hibernate会话包装了JDBC java.sql.Connection并充当org.hibernate.Transaction实例的工厂,它维护应用程序域模型的一般“可重复读取”持久性上下文(一级缓存)。

Transaction (org.hibernate.Transaction)

单线程且作为短生命周期对象用于划分应用程序的单个物理事务边界。它作为抽象API,以将应用程序与使用中的基础事务系统(JDBC或JTA)进行有效隔离。

Hibernate框架优点

【1】它消除了JDBC附带的所有模板代码,让我们更专注于业务逻辑。

【2】它提供对XML以及JPA注解的支持,使我们的代码实现完全独立。

【3】它提供与SQL类似的强大查询语言(HQL)且完全面向对象。

【4】它是Red Hat Community的一个开源项目,已在全球范围内使用,因此这是一个更好的选择,因为学习曲线很小,并且有大量的在线文档,并且可以在论坛中轻松获得帮助。

【5】它易于与其他Java EE框架集成,因此非常流行,Spring框架也提供了将Hibernate与Spring应用程序集成的内置支持。

【6】它支持使用代理对象进行延迟加载,并且仅在需要时才执行实际的数据库查询。

【7】它提供缓存有助于我们获得更好的性能。

Hibernate与JDBC相比有什么优势?

【1】它消除了JDBC API附带的许多模板代码,更清晰易读。

【2】它支持继承,关联和集合,而JDBC API不提供这些功能。

【3】它隐式提供事务管理,实际上,大多数查询无法在事务外部执行,而在JDBC API中,我们需要使用commit和rollback编写用于事务管理的代码。由于JDBC API会抛出SQLException,这是一个已检查的异常,因此我们需要编写许多try-catch块代码,在大多数情况下,它在每个JDBC调用中都是多余的, Hibernate封装了JDBC异常并抛出JDBCException或HibernateException未经检查的异常,因此我们不需要编写代码来处理它,同时Hibernate内置的事务管理消除了try-catch块的使用。

【4】它提供查询语言(HQL)且更加面向对象,与Java编程语言非常接近,而对于JDBC,我们需要编写本机SQL查询。

【5】它支持更好的性能缓存,而JDBC查询不会进行缓存,因此性能很低。

【6】它提供了一个选项,通过它我们也可以创建数据库表,而JDBC表必须存在于数据库中。

【7】它所提供的配置有助于我们将JDBC之类的连接以及JNDI DataSource用于连接池,这是企业应用程序中非常重要的功能,而JDBC API完全没有。

【8】它支持JPA注解,因此代码与实现无关,并且可以轻松地用其他ORM工具进行替换,JDBC代码与应用程序紧密结合。

总结

本节我们初步认识Hibernate框架的架构、优点以及对比JDBC其强大优势,从下一节我们开始正式进入Hibernate框架的学习。

Hibernate框架预览以及基础介绍的更多相关文章

  1. 玩转Android Camera开发(二):使用TextureView和SurfaceTexture预览Camera 基础拍照demo

    Google自Android4.0出了TextureView,为什么推出呢?就是为了弥补Surfaceview的不足,另外一方面也是为了平衡GlSurfaceView,当然这是本人揣度的.关于Text ...

  2. Android Camera开发:使用TextureView和SurfaceTexture预览Camera 基础拍照demo

    Google自Android4.0出了TextureView,为什么推出呢?就是为了弥补Surfaceview的不足,另外一方面也是为了平衡GlSurfaceView,当然这是本人揣度的.关于Text ...

  3. Android 10开发者预览版功能介绍

    Android P的开发者预览版最亮眼的功能莫过于支持“刘海屏”等屏幕显示.同样在适配可折叠设备方面,Android Q的第一个开发者预览版也很“接地气”,谷歌早在去年11月就发布了对可折叠设备的支持 ...

  4. 玩转Android Camera开发(一):Surfaceview预览Camera,基础拍照功能完整demo

    杂家前文是在2012年的除夕之夜仓促完成,后来很多人指出了一些问题,琐事缠身一直没有进行升级.后来随着我自己的使用,越来越发现不出个升级版的demo是不行了.有时候就连我自己用这个demo测一些性能. ...

  5. Android Camera开发:使用GLSurfaceView预览Camera 基础拍照

    GLSurfaceView是OpenGL中的一个类,也是可以预览Camera的,而且在预览Camera上有其独到之处.独到之处在哪?当使用Surfaceview无能为力.痛不欲生时就只有使用GLSur ...

  6. Hibernate框架(一)——总体介绍

    作为SSH三大框架之一的Hibernate,是用来把程序的Dao层和数据库打交道用的,它封装了JDBC的步骤,是我们对数据库的操作更加简单,更加快捷.利用Hibernate框架我们就可以不再编写重复的 ...

  7. 【转】玩转Android Camera开发(三):国内首发---使用GLSurfaceView预览Camera 基础拍照demo

    http://blog.csdn.net/yanzi1225627/article/details/33339965 GLSurfaceView是OpenGL中的一个类,也是可以预览Camera的,而 ...

  8. 玩转Android Camera开发(三):国内首发---使用GLSurfaceView预览Camera 基础拍照demo

    GLSurfaceView是OpenGL中的一个类,也是能够预览Camera的,并且在预览Camera上有其独到之处. 独到之处在哪?当使用Surfaceview无能为力.痛不欲生时就仅仅有使用GLS ...

  9. Hibernate框架(一)总结介绍

    作为SSH三大框架之一的Hibernate,是用来把程序的Dao层和数据库打交道用的,它封装了JDBC的步骤,是我们对数据库的操作更加简单,更加快捷.利用Hibernate框架我们就可以不再编写重复的 ...

随机推荐

  1. LeetCode 第20题--括号匹配

    1. 题目 2.题目分析与思路 3.代码 1. 题目 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭 ...

  2. C# 自动批量搜索指定关键字,没有注册的域名

    做好网站了,部署上线.想注册域名,但是想了很多要注册的,都被别人注册了.例如已经做好了体育资讯的网站,想要包含关键字sport的域名,就可以用这个工具自动完成搜索. 效果如下图: 演示程序结构 在vs ...

  3. 并查集——奇偶性(Parity)

    题目描述 •有一个01序列,长度<=1000000000,现在有n条信息,每条信息的形式是-a b even/odd.表示第a位到第b位元素之间的元素总和是偶数/奇数. •你的任务是对于这些给定 ...

  4. 使用C++进行声明式编程

            声明式编程(英语:Declarative programming)是一种编程范型,与命令式编程相对立.它描述目目标性质,让计算机明白目标,而非流程.声明式编程不用告诉电脑问题领域,从而 ...

  5. SpringBoot实现简单的CRUD

    CRUD-员工列表 实验要求: 1).RestfulCRUD:CRUD满足Rest风格: URI: /资源名称/资源标识 HTTP请求方式区分对资源CRUD操作 2).实验的请求架构; 3).员工列表 ...

  6. Python学习,第五课 - 列表、字典、元组操作

    本篇主要详细讲解Python中常用的列表.字典.元组相关的操作 一.列表 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 通过下标获取元素 #先定义一个列表 le ...

  7. jemeter察看结果树中文乱码解决办法

    在使用jemeter进行接口测试时,在察看结果树查看接口返回结果时,中文全部显示乱码,这个问题的解决方式如下: 在jemeter的安装路径下面,找到bin目录下, 在bin目录下面找到这个文件:jme ...

  8. ROS中的3D建模机器人(三)

    一.利用xacro理解机器人建模 当我们创建复杂的机器人模型时,URDF的灵活性将会降低,URDF缺少的主要特性是简单的.可重用性,模块化和可编程性. URDF是一个单独的文件我们不能在它里面包含其他 ...

  9. ceph问题

    问题1: [root@admin-node my-cluster]# ceph -s cluster 4ca35731-2ccf-47fb-9f06-41fae858626d health HEALT ...

  10. Ceph 存储集群7-故障排除

    Ceph 仍在积极开发中,所以你可能碰到一些问题,需要评估 Ceph 配置文件.并修改日志和调试选项来纠正它. 一.日志记录和调试 般来说,你应该在运行时增加调试选项来调试问题:也可以把调试选项添加到 ...