为什么80%的码农都做不了架构师?>>>   

现在我们知道了一个概念Hibernate Session,只有处于Session管理下的POJO才具有持久化操作能力。当应用程序对于处于Session管理下的POJO实例执行操作时,Hibernate将这种面向对象的操作转换成了持久化操作能力。

HIbernate简要的体系结构如下图所示:

通过上图能够发现HIbernate需要一个hibernate.properties文件,该文件用于配置Hibernate和数据库连接的信息。还需要一个XML文件,该映射文件确定了持久化类和数据表、数据列之间的想对应关系。

除了使用hibernate.properties文件,还可以采用另一种形式的配置文件: *.cfg.xml文件。在实际应用中,采用XML配置文件的方式更加广泛,两种配置文件的实质是一样的。

Hibernate的持久化解决方案将用户从赤裸裸的JDBC访问中释放出来,用户无需关注底层的JDBC操作,而是以面向对象的方式进行持久层操作。底层数据连接的获得、数据访问的实现、事务控制都无需用户关心。这是一种“全面解决”的体系结构方案,将应用层从底层的JDBC/JTA API中抽象出来。通过配置文件来管理底层的JDBC连接,让Hibernate解决持久化访问的实现。这种“全面解决”方案的体系结构图如图所示:

针对以上的Hibernate全面解决方案架构图:

(1)SessionFactory这是Hibernate的关键对象,它是单个数据库映射关系经过编译后的内存镜像,它也是线程安全的它是生成Session的工厂,本身要应用到ConnectionProvider,该对象可以在进程和集群的级别上,为那些事务之间可以重用的数据提供可选的二级缓存。

(2)Session:它是应用程序和持久存储层之间交互操作的一个单线程对象。它也是Hibernate持久化操作的关键对象,所有的持久化对象必须在Session的管理下才能够进行持久化操作。此对象的生存周期很短,其隐藏了JDBC连接,也是Transaction 的工厂。Session对象有一个一级缓存,现实执行Flush之前,所有的持久化操作的数据都在缓存中Session对象处。

(3)持久化对象:系统创建的POJO实例一旦与特定Session关联,并对应数据表的指定记录,那该对象就处于持久化状态,这一系列的对象都被称为持久化对象。程序中对持久化对象的修改,都将自动转换为持久层的修改。持久化对象完全可以是普通的Java Beans/POJO,唯一的特殊性是它们正与Session关联着。

(4)瞬态对象和脱管对象:系统进行new关键字进行创建的Java 实例,没有Session 相关联,此时处于瞬态。瞬态实例可能是在被应用程序实例化后,尚未进行持久化的对象。如果一个曾今持久化过的实例,但因为Session的关闭而转换为脱管状态。

(5)事务(Transaction):代表一次原子操作,它具有数据库事务的概念。但它通过抽象,将应用程序从底层的具体的JDBC、JTA和CORBA事务中隔离开。在某些情况下,一个Session 之内可能包含多个Transaction对象。虽然事务操作是可选的,但是所有的持久化操作都应该在事务管理下进行,即使是只读操作。

(6)连接提供者(ConnectionProvider):它是生成JDBC的连接的工厂,同时具备连接池的作用。他通过抽象将底层的DataSource和DriverManager隔离开。这个对象无需应用程序直接访问,仅在应用程序需要扩展时使用。

(7)事务工厂(TransactionFactory):他是生成Transaction对象实例的工厂。该对象也无需应用程序的直接访问。

Hibernate进行持久化操作离不开SessionFactory对象,这个对象是整个数据库映射关系经过编译后的内存镜像,该对象的openSession()方法可打开Session对象。SessionFactory对想是由Configuration对象产生。

每个Hibernate配置文件对应一个configuration对象。在极端情况下,不使用任何配置文件,也可以创建Configuration对象。

一. 创建Configuration对象

        org.hibernate.cfg.Configuration实例代表一个应用程序到SQL数据库的映射配置,Configuration提供了一个buildSessionFactory()方法,该方法可以产生一个不可变的SessionFactory对象。

你可以直接实例化Configuration来获取一个实例,并为它指定一个Hibernate映射文件,如果映射文件在类加载路径中,则可以使用addResource()方法来添加映射定义文件。那么现在的问题就是如何创建Configuration对象呢?

随着Hibernate 所使用的配置文件的不同,创建Configuration对象的方式也不相同。通常有几种配置Hibernate的方式:

第一种是使用hibernate.properties文件作为配置文件。

第二种是使用hibernate.cfg.xml文件作为配置文件。

第三种是不使用任何的配置文件,以编码方式来创建Configuration对象。

请注意:Configuration对象的唯一作用就是创建SessionFactory实例,所以它才被设计成为启动期间对象,而一旦SessionFactory对象创建完成,它就被丢弃了。

1. 使用hibernateproperties作为配置文件

对于hibernate.properties作为配置文件的方式,比较适合于初学者。因为初学者往往很难记住该配置文件的格式,以及需要配置哪些属性。在Hibernate发布包的etc路径下,提供了一个hibernate.properties文件,该文件列出了Hibernate 的所有属性。每个配置段都给出了大致的注释,用户只要取消所需配置段的注释,就可以快速配置Hibernate和数据库的链接此处给出使用hibernate.properties文件创建Configuration对象的方法。

//实例化configuration对象
Configuration cfg = new Configuration()
//多次调用addResource()方法,添加映射文件
.addResource("Item.hbm.xml")
.addResource("Bid.hbm.xml");

查看hibernate.properties文件发现,该文件没有提供Hibernate映射文件的方式。因此使用hibernate.properties文件来作为配置文件时,必须使用Configuration的.addResource()方法,使用该方法来添加映射文件。

注意:正如上面的代码所示,使用hibernate.properties文件配置Hibernate的属性固然简单,但是因为要手动添加映射文件,当映射文件极其多时,这是一件非常催人泪下的事情。这也就是在实际开发中,不常使用hibernate.properties文件作为配置文件的原因。

当然还有另一种添加配置文件的策略,因为映射文件和持久化类是一一对应的,可以通过Configuration对象来添加持久化类,让Hibernate自己来搜索映射文件。

//实例化configuration对象
Configuration cfg = new Configuration)
//多次调用addClass()方法,直接添加持久化类
.addClass(ppp.Item.class)
.addClass(ppp.BId.class);

2. 使用hibernate.cfg.xml作为配置文件

前面已经看到使用hibernate.properties作为配置文件的情形。因为hibernate.cfg.xml中已经添加了hibernate的映射文件,采用这种配置文件创建configuration对象实例由以下代码实现:

//实例化configuration对象
Configuration cfg = new Configuration()
//configure()方法将会负责加载hibernate.cfg.xml文件
.configure()

   需要注意的是:在通过new关键字创建Configuration对象之后,不要忘记调用configure()方法。

二. hibernate.properties和hiberntae.cfg.xml文件

如果使用etc路径下的hibernate.properties文件作为配置文件的模板,修改此模板文件作为Hibernate配置文件,这种方式的确是快速进入Hibernate开发的方法。但是对于实际开发,通常会使用hibernate.cfg.xml文件作为配置文件。

深入对比hibernate.properties和hibernate.cfg.xml文件后看如下的hibernate.properties的一个配置属性:

//指定数据库的方言
hibernate.dialect org.hibernate.dialect.MySQLDialect

上面的一行代码是典型的Properties文件的的格式,前面的key为hibernate.dialect , 后面的value是为org.hibernate.dialect.MySQLDialect。

接下来我们再来查看hibernate.cfg.xml文件中的相对应的配置代码:

<property name = "dialect">org.hibernate.dialect.MySQLDialect</property>

同样指定了Hibernate的Dialect 属性是org.hibernate.dialect.MySQLDialect 。对比两种格式的文件,可以发现虽然格式不同但其实质完全一样。

转载于:https://my.oschina.net/ZGang/blog/380733

hibernate的实现原理相关推荐

  1. Hibernate(2)——Hibernate的实现原理总结和对其模仿的demo

    俗话说,自己写的代码,6个月后也是别人的代码--复习!复习!复习!涉及的知识点总结如下: 开源框架的学习思路(个人总结) Hibernate的运行原理总结 Hibernate实现原理中的两个主要技术 ...

  2. Hibernate的工作原理

            Hibernate的工作原理 原理: 1.通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件 2.由hibernate.c ...

  3. Hibernate的发展和特点以及Hibernate的工作原理简介

    1.Hibernate的发展和特点: (1).Hibernate介绍:Hibernate是封装了JDBC的一种开放源代码的对象/关系映射(ORM Object-Relatiion Mapping)框架 ...

  4. 菜鸟学SSH(十五)——简单模拟Hibernate实现原理

    之前写了Spring的实现原理,今天我们接着聊聊Hibernate的实现原理,这篇文章只是简单的模拟一下Hibernate的原理,主要是模拟了一下Hibernate的Session类.好了,废话不多说 ...

  5. Struts 2 Spring Hibernate三大框架的执行流程以及原理

    转:http://www.cnblogs.com/System-out-println/p/5974113.html Struts2框架 一.简介 Struts2是一个相当强大的Java Web开源框 ...

  6. java面试要点---Hibernate面试系统知识点复习,hibernate原理,缓冲---随时更新

    1.Hibernate基础 1.1. Hibernate用来做什么 * Hibernate是开源的.用亍封装数据访问层的组件,我们称乊为数据访问层框架(戒持久层框架). 乊前我们通过JDBC/SQL语 ...

  7. Hibernate复习之Hibernate基本介绍

    众所周知.眼下流行的面向对象的对象关系映射的Java持久层框架有MyBatis和Hibernate.他们都是对象关系映射ORM. 解决的主要问题就是对象-关系的映射.域模型和关系模型都分别建立在概念模 ...

  8. 手低眼高 初学者学习Hibernate的方法

    Hibernate入门容易,掌握精通我也不敢自夸.我第一遍看Hibernate文档的时候也觉得很吃力,但不是因为Hibernate难掌握而感到吃力,是因为Hibernate文档处处都是持久层设计的经验 ...

  9. (Hibernate进阶)Hibernate系列——总结篇(九)

    这篇博文是hibernate系列的最后一篇,既然是最后一篇,我们就应该进行一下从头到尾,整体上的总结,将这个系列的内容融会贯通. 概念 Hibernate是一个对象关系映射框架,当然从分层的角度看,我 ...

最新文章

  1. RabbitMQ入门(4)--路由
  2. l2_norm c++代码实现
  3. Windows下配置Tomcat使用https协议
  4. mysql8出现1045报错+常用的加密plugin汇总
  5. tcp实时传输kafka数据_tcp怎么传输大数据
  6. 计算机专业 毕业论文 百度云,计算机专业毕业论文.pdf
  7. 如何用Python破解验证码,适合新手练手
  8. 数据的统计分析与描述
  9. 3.5 RNN 层使用方法
  10. Loadrunner脚本录制执行
  11. 微信小程序中使用emoji表情
  12. http://www.cnblogs.com/freeliver54/p/3725979.html
  13. android 获取快捷开关_6款快捷开关式实用安卓小插件推荐 简化Android设备操作
  14. 电脑小知识:最常用的10个电脑技巧
  15. 笔记本外接显示器没有声音
  16. sql查询当天交易总额最大的用户信息_如何分析交易记录? 因为后面要分析“每种类型用户的总交易金额”,所以保留左表(用户交易记录表)中的全部用户数据。 【题目】 某商场为了分析用... - 雪球...
  17. AHB到标准握手时序桥 - 逻辑设计部分
  18. K8S部署系统异常-FailedCreatePodSandBox:network: failed to set bridge addr: “cni0“ already has an IP addres
  19. 查看oracle操作日志
  20. 国内从事机器视觉领域的公司(转)

热门文章

  1. python 安卓模拟点击_python模拟点击在ios中实现的实例讲解
  2. char值序列是什么Java_CharSequence和java之间的确切区别
  3. byfen网java_Java企业级分布式架构师第10期2020年-开课吧全套
  4. mysql innodb commit_MySQL:Innodb 关于Handler_commit每次DML增加2的原因
  5. 蓝牙模块引起电路干扰
  6. 2020年春季学期教学日历
  7. clustalw序列比对_如何做出漂亮的序列比对图——ENDscript/ESPript
  8. 请输入课程编号C语言,C语言 学生选课系统 程序
  9. django安装mysql_django+mysql安装和设置
  10. 服务器同步什么文件类型,不同服务器同步文件类型