引导目录:

  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. Leetcode 笔记 98 - Validate Binary Search Tree

    题目链接:Validate Binary Search Tree | LeetCode OJ Given a binary tree, determine if it is a valid binar ...

  2. java太low,又舍不得jvm平台的丰富资源?试试kotlin吧(一)

    尝试kotlin的起因 因为各种原因(版权,人员招聘),公司的技术体系从c#转到了java,我花了大概两周的时间来上手java,发现java的语法还是非常简单的,基本看着代码就知道什么意思.学习jav ...

  3. 用C表达面向对象语言的机制——C#版

    PS:本文PDF版在这里(格式更好看一些).最新的源代码请在本页面文末下载,PDF中的链接不是最新的. 用C表达面向对象语言的机制——C#版 我一直认为,面向对象语言是对面向过程语言的封装.如果是这样 ...

  4. Android 浏览器 —— 使用 WebView 实现文件下载

    对当前的WebView设置下载监听 mCurrentWebView.setDownloadListener(new DownloadListener() { @Override public void ...

  5. 解析大型.NET ERP系统 数据审计功能

    数据审计,英语表达是Audit,是追踪数据变化的过程,记录数据变化前后的值,供参考分析.通过设置,ERP可以追踪一个表的所有字段的变化,也可以只记录指定的字段的值变化.欧美企业每年都有独立的审计部门, ...

  6. ASP.NET MVC5+EF6+EasyUI 后台管理系统(28)-系统小结

    系列目录 我们从第一节搭建框架开始直到二十七节,权限管理已经告一段落,相信很多有跟上来的园友,已经搭配完成了,并能从模块创建授权分配和开发功能了 我没有发布所有源代码,但在14节发布了最后的一次源代码 ...

  7. 【NLP】基于统计学习方法角度谈谈CRF(四)

    基于统计学习方法角度谈谈CRF 作者:白宁超 2016年8月2日13:59:46 [摘要]:条件随机场用于序列标注,数据分割等自然语言处理中,表现出很好的效果.在中文分词.中文人名识别和歧义消解等任务 ...

  8. 匹夫细说C#:委托的简化语法,聊聊匿名方法和闭包

    0x00 前言 通过上一篇博客<匹夫细说C#:庖丁解牛聊委托,那些编译器藏的和U3D给的>的内容,我们实现了使用委托来构建我们自己的消息系统的过程.但是在日常的开发中,仍然有很多开发者因为 ...

  9. IDEA上安装和使用checkstyle,findbugs,visualVM,PMD插件

    ##安装插件步骤: 1.打开settings 2.选择plugins 3.点击"Browse repositories" 4.搜索对应内插件,点击"install&quo ...

  10. Android手机越用越卡?

    一直不懂Android手机为什么会越用越卡,而ios就几乎能一直保持流畅度.后来发现这个锅不该google背,而是国内混乱的Android软件开发商的锅.主要是Android对应用没什么限制,而goo ...