引导目录:

  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. Android Starting Window(Preview Window)

    当打开一个Activity时,如果这个Activity所属的应用还没有在运行,系统会为这个Activity所属的应用创建一个进程,但进程的创建与初始化都需要时间,在这个动作完成之前系统要做什么呢?如果 ...

  2. Android-Eclipse-INSTALL_FAILED_UPDATE_INCOMPATIBLE错误

    电脑重装了系统,环境问题一大堆,唉,搞死人,这不,今天就出现了这样的一个奇怪的问题. INSTALL_FAILED_UPDATE_INCOMPATIBLE 最后搜了一遍,发现是因为已经安装了这个包,包 ...

  3. Jps命令—使用详解

    jps是jdk提供的一个查看当前Java进程的小工具, 可以看做是JavaVirtual Machine Process Status Tool的缩写.非常简单实用. 命令格式:jps [option ...

  4. c#操作MangoDB 之MangoDB CSharp Driver驱动详解

    序言 MangoDB CSharp Driver是c#操作mongodb的官方驱动. 官方Api文档:http://api.mongodb.org/csharp/2.2/html/R_Project_ ...

  5. 【原创经验分享】JQuery(Ajax)调用WCF服务

    最近在学习这个WCF,由于刚开始学 不久,发现网上的一些WCF教程都比较简单,感觉功能跟WebService没什么特别大的区别,但是看网上的介绍,就说WCF比WebService牛逼多少多少,反正我刚 ...

  6. Microsoft Build 2016 Day 2 记录(多图慎入)

    Microsoft Build 2016 Day 1 记录 Microsoft Build 2016 进行到了第二天,我觉得这一天的内容非常精彩,因为主要和开发者相关

  7. 计算机网络学习笔记--网络层之IP地址与子网

    IPv4地址: 我们知道在网络层(TCP/IP体系结构的网际互联层),最重要的一个协议就是IP协议,现在正处于IPv4和IPv6的过渡时期,但目前来说,IPv4仍为主流,所以主要讲Ipv4. IP地址 ...

  8. 1.C#面向对象基础简介

    学习核心内容: 面向对象的三个特性:封装.继承.多态 访问级别:用处在于控制成员在那些地方可以访问,这样达到面向对象封装的目的. 常用级别:public (任何地方都可以访问) private(默认级 ...

  9. JavaScript结构三层——思想快速介绍

    本文版权归博客园和作者吴双本人所有,转载和爬虫请注明原文地址 http://www.cnblogs.com/tdws/,我是博客园蜗牛,我们共同进步. 今天讨论的是什么 如果你的工作中需要写JavaS ...

  10. .NET开发之快捷键篇

    引言:我们都知道快捷键使用得熟,将极大的提高我们的开发效率.可是我发现许多开发人员老喜欢用鼠标去点,不擅长使用快捷键. 1.VS常用快捷键 这个我们记住开发中常用的就可以了. F4:打开属性面板. F ...