引导目录:

  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. 架构 Roadmap 笔记分享

    虽然我们的架构不是开源的,不过一些笔记可以愿意公开和大家讨论一下,我相信不少人在和我们干着同样的事情,那不如一块儿交流一下,这样我们可以更快. 这里前端,后端都有,前端我们用的是 avalon js, ...

  2. dhcp协议交互报文

    DHCP共有八种报文,分别为DHCP Discover.DHCP Offer.DHCP Request.DHCP ACK.DHCP NAK.DHCP Release.DHCP Decline.DHCP ...

  3. 【WCF】基址与默认终结点

    五月份的时候,有位老友给老周提了个建议:希望老周写一写WCF的文章.其实老周以前是写过WCF的文章的,只是不是写在这个博客里,老周并不打算把X年前的博客导进来,要写的话,重新写吧.毕竟,那个时候写的文 ...

  4. Chrome浏览器必装的扩展工具

    名称 作用 下载地址 Postman 模拟各种http请求 点击下载 JSON Viewer 访问json结果自动视图化 点击下载 Axure RP Extension for Chrome 查看Ax ...

  5. SQL Server 执行计划利用统计信息对数据行的预估原理二(为什么复合索引列顺序会影响到执行计划对数据行的预估)

    本文出处:http://www.cnblogs.com/wy123/p/6008477.html 关于统计信息对数据行数做预估,之前写过对非相关列(单独或者单独的索引列)进行预估时候的算法,参考这里. ...

  6. JavaScript instanceof vs typeof

    Use instanceof for custom typesvar ClassFirst = function () {};var ClassSecond = function () {};var ...

  7. ASP.NET Core官方计划路线及需要废除的一些Framework技术

    概述 下面是 ASP.NET Core的时间表和路线图. 注意日期和特性都可能更改. 作为.NET Core这么大的一个项目,很难准确预测每一个计划的是否有变动. 即便如此,我们还是计划公开和透明的实 ...

  8. .Net语言 APP开发平台——Smobiler学习日志:快速实现手机上的图片上传功能

    最前面的话:Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便 一.目标样式 我们要实现上图中的效果,需要如下的操作: 1.从工具栏上的"S ...

  9. 配置IIS的通配符应用程序映射

    使用IIS 6架设网站,如果要使用伪静态的功能,可能需要设置“通配符应用程序映射(执行顺序)”. 在Windows Server 2012 r2 的IIS 8中,对应的是添加设置“通配符脚本映射”,参 ...

  10. Yii 2.x 多主题 - 多语言 配置

    语言:只要在原来模板的位置建立语言目录 多主题:要重新定义模板的根目录