引导目录:

  Hibernate 系列教程 目录

前言:

  通过上一篇的增删改查小练习之后,咱们大概已经掌握了Hibernate的基本用法。

  我们发现,在调用Hibernate API的过程中,虽然Hibernate里面为咱们提供了很多的类,但是常用的类只有很少的那么几个。

  下面,一起着重地看一下其中配置相关的类 - Configuration & SessionFactory。

目录:

  1. Configuration 类 (负责管理Hibernate的配置信息)
  2. SessionFactory 类 (负责创建Session的实例)

1. Configuration 类 (负责管理Hibernate的配置信息)

  Configuration类负责管理Hibernate的配置信息。

  当创建SessionFactory时,Configuration实例可以指定使用哪一个映射文档(xxx.cfg.xml)。

  应用程序通常只是创建一个Configuration实例,并通过它创建一个SessionFactory实例。

  例如下面的代码:

     private static SessionFactory sessionFactory = null;
     static{
         try {
             sessionFactory = new Configuration().configure().buildSessionFactory();
         }catch (HibernateException ex){
             throw new RuntimeException("Exception building SessionFacotry: "+ex.getMessage());
         }
     }

  当客户端发送一个请求线程时,SessionFactory初始化一个Session(大部分对数据库的操作都调用Session类的API来完成)。

  代码如下:

     public static final ThreadLocal sessionMap = new ThreadLocal();
     public static Session currentSession() throws HibernateException{
         Session s = (Session)sessionMap.get();
         // 如果此线程还没有打开一个Session,则新建一个
         if (s == null) {
             s = sessionFactory.openSession();
             sessionMap.set(s);
         }
         return s;
     }

  对于第一次使用Hibernate的初学者来说,下面的这段代码可以说是最常见的使用Configuration的方式了:

 Configuration cfg = new Configuration().configure();

  Configuration是Hibernate的入口,在新建一个Configuration的实例时(构造),Hibernate会在CLASSPATH环境变量中查找hibernate.properties文件。

  如果该文件存在,则将文件的内容加载到内容中,如果不存在,则抛出例外。

   .configure() 方法默认会在CLASSPATH环境变量下面寻找hibernate.cfg.xml文件,参见源码, configure() 的内部实现为:

     public Configuration configure() throws HibernateException {
         return this.configure("hibernate.cfg.xml");
     }

  如果没有找到,系统会打印信息并抛出HibernateException;

  如果找到该文件, configure() 方法会首先访问 <session-factory> 配置节点,并获取该元素的name属性;如果非空,将用这个配置的值来覆盖hibernate.properties的hibernate.session_factory_name的配置值。

  从这里可以看出,hibernate.cfg.xml中的配置信息可以覆盖hibernate.properties的配置信息。

  Configuration的configure()方法还支持带参数的访问形式,可以指定xxx.cfg.xml文件的位置,而不是使用默认的CLASSPATH中设置的hibernate.cfg.xml。

  例如:

 File file = new File("D:\\configs\\hibernate.cfg.xml");
 Configuration cfg = new Configuration().configure(file);

  Configuration还提供了一系列方法用来定制Hibernate的加载配置文件的过程,可以让应用更灵活。

  常用的有以下几种:

  • addProperties(Element)
  • addProperties(Properties)
  • setProperties(Properties)
  • setProperty(String, String)

  通过以上的几个方法,除了使用默认的hibernate.properties文件,还可以提供多个.properties配置文件。

  使用Hibernate时可以根据不同的情况使用不同的配置文件,例如:

1 Properties p = new Properties();
 p.load(new FileInputStream("my.properties"));
 Configuration cfg = new Configuration().setProperties(p).configure();

  除了指定.properties文件外,还可以指定xxx.hbm.xml文件。

  下面列出几个常用的方法:

  • addClass(Class)
  • addFile(File)
  • addFile(String)
  • addURL(URL)

  前面已经讲过,configure()方法默认是通过访问hibernate.cfg.xml的<mapping>元素来加载程序员所提供的xxx.hbm.xml文件。

  上面列出的方法可以直接指定xxx.hbm.xml文件,例如,addClass()方法可以直接通过指定Class类加载对应的映射文件,Hibernate会将提供的Class的全名(包括package)自动转化为文件路径。

  如com.geeksss.entity.Student.class对应了com/geeksss/entity/Student.hbm.xml。

  还可以使用addFile()方法直接指定映射文件,例如下面的例子:

 Configuration cfg = new Configuration().addClass(Student.class);

  或:

 Configuration cfg = new Configuration().addURL(Configuration.class.getResource("Student.hbm.xml"));

  或:

 Configuration cfg = new Configuration().addFile("Student.hbm.xml");

  Configuration提供的这些方法的优点如下:

  • 一个应用程序中往往有很多xxx.hbm.xml映射文件,开发的过程中如果只是为了测试某个或几个Java PO (Persistence Object),则没有必要把所有的xxx.hbm.xml都加在到内存中。
    这样可以通过addClass()或者addFile()方法直接加载,显得非常灵活。
  • 学习Hibernate的过程中,往往需要通过练习来体会Hibernate提供的各种特征,而很多特征是需要修改配置文件的。
    如果要观察相同的代码在不同特征下的表现是怎样的,就需要手工修改配置文件,这样太麻烦了,而且容易出错,但是可以提供多个配置文件,每个配置文件针对需要的特征而配置。
    在调用程序时,把不同的配置文件作为参数传递进去,而程序代码中使用setProperties()和addFile()指定传入的配置文件参数即可。

2. SessionFactory 类 (负责创建Session的实例)

  SessionFactory负责Session实例的创建。

  为了能创建一个Session对象,必须在Hibernate初始化时创建一个Configuration类的实例,并将已经写好的映射文件交由它处理。

  这样,Configuration对象就可以创建一个SessionFactory对象,当SessionFactory对象创建成功之后,Configuration对象就没有用了,可以简化的抛弃它。

  例如下面的示例代码:

 Configuration cfg = new Configuration().configure();
 SessionFactory sessionFactory = cfg.buildSessionFactory();

  SessionFactory是线程安全的,可以被多线程调用以取得Session,而且构造SessionFactory很消耗资源。

  所以多数情况下一个应用中之初始化一个SessionFactory,为不同的线程提供Session。

Hibernate 系列 04 - Hibernate 配置相关的类的更多相关文章

  1. Hibernate 系列 02 - Hibernate介绍及其环境搭建

    引导目录: Hibernate 系列教程 目录 昨晚喝多了,下午刚清醒,继续搞Hibernate.走起. 觉得还行的话,记得点赞哈,给我这个渣渣点学习的动力.有错误的话也请指出,省的我在错误上走了不归 ...

  2. Hibernate 系列 07 - Hibernate中Java对象的三种状态

    引导目录: Hibernate 系列教程 目录 1. Java对象的三种状态 当应用通过调用Hibernate API与框架发生交互时,需要从持久化的角度关注应用对象的生命周期. 持久化声明周期是Hi ...

  3. Hibernate 系列教程1-枚举单例类

    你还在为不知道怎样正确使用Hibernate而纠结吗 你还在为不知道怎样配置映射文件而郁闷吗 枚举单例(Enum Singleton) 是实现单例模式的一种方式而已,不过写法简单,创建枚举默认也是线程 ...

  4. Hibernate系列之基本配置

    一.概述 Hibernate是一个开放源码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使我们可以使用对象的编程思维来操作数据库. 二.配置准备 IDE:Eclipse 下载Jar包: ...

  5. Hibernate 系列 学习笔记 目录 (持续更新...)

    前言: 最近也在学习Hibernate,遇到的问题差不多都解决了,顺便把学习过程遇到的问题和查找的资料文档都整理了一下分享出来,也算是能帮助更多的朋友们了. 最开始使用的是经典的MyEclipse,后 ...

  6. Hibernate 系列 05 - Session 类

    引导目录: Hibernate 系列教程 目录 前言: Session是Hibernate运作的中心,对象的生命周期.事务的管理.数据库的存取都与Session息息相关. 就如同在编写JDBC时需要关 ...

  7. 【SSH系列】---Hibernate的基本映射

    开篇前言       在前面的博文中,小编分别介绍了[SSH系列]-- hibernate基本原理&&入门demo,通过这篇博文,小伙伴们对hibernate已经有了基本的了解,以及h ...

  8. Hibernate 系列 03 - 使用Hibernate完成持久化操作

    引导目录: Hibernate 系列教程 目录 康姆昂,北鼻,来此狗.动次打次,Hibernate继续走起. 目录: 使用Hibernate实现按主键查询 使用Hibernate实现数据库的增.删.改 ...

  9. hibernate系列笔记(1)---Hibernate增删改查

    Hibernate增删改查 1.首先我们要知道什么是Hibernate Hibernate是一个轻量级的ORMapping对象.主要用来实现Java和数据库表之间的映射,除此之外还提供数据查询和数据获 ...

随机推荐

  1. API Monitor简介(API监控工具)

    API Monitor是一个免费软件,可以让你监视和控制应用程序和服务,取得了API调用. 它是一个强大的工具,看到的应用程序和服务是如何工作的,或跟踪,你在自己的应用程序的问题. 64位支持 API ...

  2. 如何利用 Visual Studio 自定义项目或工程模板

    在开发项目的时候,由其是商业性质的大型项目时,往往需要在每个代码文件上都加上一段关于版权.开发人员的信息,并且名称空间上都需要带有公司的标志.这个时候,是选择在开发的时候手动添加还是自动生成呢? 我们 ...

  3. es6 新特性2

    es6其他几个非常有用的新特性. import export 这两个家伙对应的就是es6自己的module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成 ...

  4. JavaScript高级编程 (2) - HTML 与 JavaScript

    向HTML 页面中插入JavaScript 的主要方法,就是使用<script>元素.这个元素由Netscape 创造并在Netscape Navigator 2 中首先实现.后来,这个元 ...

  5. awk命令简介

    awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各 ...

  6. Android动画效果之Property Animation进阶(属性动画)

    前言: 前面初步认识了Android的Property Animation(属性动画)Android动画效果之初识Property Animation(属性动画)(三),并且利用属性动画简单了补间动画 ...

  7. Log4net入门(SQL篇)

    我们在Log4net入门(回滚日志篇)中详细讲述了如何将日志信息输出到日志文件中,在这一篇中,我们将讲述如何将日志文件写入SQL Server数据库,以方便我们分析统计日志信息. 首先,我们在SQL ...

  8. RAC 主库配置单实例ADG

    1.主库准备工作 2.物理备库准备工作 3.创建物理备库 写在前面: 最终实现环境:11.2.0.4版本 2节点RAC + 1节点DG 本文旨在弄清楚整个搭建过程中涉及到的基础概念: 本文安装maxi ...

  9. ASP.NET Core 中文文档 第三章 原理(11)在多个环境中工作

    原文: Working with Multiple Environments 作者: Steve Smith 翻译: 刘浩杨 校对: 孟帅洋(书缘) ASP.NET Core 介绍了支持在多个环境中管 ...

  10. CSS知识总结(三)

    CSS的常用样式 1.字体样式 1)字体名称(font-family) font-family  :  <family-name> 设置文字名称,可以使用多个名称,或者使用逗号分隔,浏览器 ...