Hibernate 系列 04 - Hibernate 配置相关的类
引导目录:
前言:
通过上一篇的增删改查小练习之后,咱们大概已经掌握了Hibernate的基本用法。
我们发现,在调用Hibernate API的过程中,虽然Hibernate里面为咱们提供了很多的类,但是常用的类只有很少的那么几个。
下面,一起着重地看一下其中配置相关的类 - Configuration & SessionFactory。
目录:
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 配置相关的类的更多相关文章
- Hibernate 系列 02 - Hibernate介绍及其环境搭建
引导目录: Hibernate 系列教程 目录 昨晚喝多了,下午刚清醒,继续搞Hibernate.走起. 觉得还行的话,记得点赞哈,给我这个渣渣点学习的动力.有错误的话也请指出,省的我在错误上走了不归 ...
- Hibernate 系列 07 - Hibernate中Java对象的三种状态
引导目录: Hibernate 系列教程 目录 1. Java对象的三种状态 当应用通过调用Hibernate API与框架发生交互时,需要从持久化的角度关注应用对象的生命周期. 持久化声明周期是Hi ...
- Hibernate 系列教程1-枚举单例类
你还在为不知道怎样正确使用Hibernate而纠结吗 你还在为不知道怎样配置映射文件而郁闷吗 枚举单例(Enum Singleton) 是实现单例模式的一种方式而已,不过写法简单,创建枚举默认也是线程 ...
- Hibernate系列之基本配置
一.概述 Hibernate是一个开放源码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使我们可以使用对象的编程思维来操作数据库. 二.配置准备 IDE:Eclipse 下载Jar包: ...
- Hibernate 系列 学习笔记 目录 (持续更新...)
前言: 最近也在学习Hibernate,遇到的问题差不多都解决了,顺便把学习过程遇到的问题和查找的资料文档都整理了一下分享出来,也算是能帮助更多的朋友们了. 最开始使用的是经典的MyEclipse,后 ...
- Hibernate 系列 05 - Session 类
引导目录: Hibernate 系列教程 目录 前言: Session是Hibernate运作的中心,对象的生命周期.事务的管理.数据库的存取都与Session息息相关. 就如同在编写JDBC时需要关 ...
- 【SSH系列】---Hibernate的基本映射
开篇前言 在前面的博文中,小编分别介绍了[SSH系列]-- hibernate基本原理&&入门demo,通过这篇博文,小伙伴们对hibernate已经有了基本的了解,以及h ...
- Hibernate 系列 03 - 使用Hibernate完成持久化操作
引导目录: Hibernate 系列教程 目录 康姆昂,北鼻,来此狗.动次打次,Hibernate继续走起. 目录: 使用Hibernate实现按主键查询 使用Hibernate实现数据库的增.删.改 ...
- hibernate系列笔记(1)---Hibernate增删改查
Hibernate增删改查 1.首先我们要知道什么是Hibernate Hibernate是一个轻量级的ORMapping对象.主要用来实现Java和数据库表之间的映射,除此之外还提供数据查询和数据获 ...
随机推荐
- 浅谈跨域以及WebService对跨域的支持
跨域问题来源于JavaScript的同源策略,即只有 协议+主机名+端口号 (如存在)相同,则允许相互访问.也就是说JavaScript只能访问和操作自己域下的资源,不能访问和操作其他域下的资源. 在 ...
- 转-基于NodeJS的14款Web框架
基于NodeJS的14款Web框架 2014-10-16 23:28 作者: NodeJSNet 来源: 本站 浏览: 1,399 次阅读 我要评论暂无评论 字号: 大 中 小 摘要: 在几年的时间里 ...
- 使用自定义 classloader 的正确姿势
详细的原理就不多说了,网上一大把, 但是, 看了很多很多, 即使看了jdk 源码, 说了罗里吧嗦, 还是不很明白: 到底如何正确自定义ClassLoader, 需要注意什么 ExtClassLoade ...
- PHP日志压缩下载
主要实现了在后台查看日志列表及打包下载功能. 由于用到了PHP压缩功能,特此记录下. 压缩下载类: Hzip.php <?php /** * Created by PhpStorm. * @au ...
- <JavaScript语言精粹>--<读书笔记三>之replace()与正则
今天有人问我repalce(),他那个题目很有意思.我也不会做,于是我就去查,结果发现就是最基础的知识的延伸. 所以啊最基础的知识才是很重要的,千万不能忽略,抓起JS就写代码完全不知到所以然,只知道写 ...
- SQL Server-分页方式、ISNULL与COALESCE性能分析(八)
前言 上一节我们讲解了数据类型以及字符串中几个需要注意的地方,这节我们继续讲讲字符串行数同时也讲其他内容和穿插的内容,简短的内容,深入的讲解,Always to review the basics. ...
- ASP.NET 5 Target framework dnx451 and dnxcore50
中文不知如何定义标题,所以干脆就直接贴出关键字,在 ASP.NET 5 项目的 project.json 配置文件中,会有这样的定义: "frameworks": { " ...
- Bootstrap框架的学习(一)
一.Bootstrap框架介绍 Bootstrap是一个非常优秀的前端UI框架,一个轻量级的UI前端框架,是基于HTML+CSS+JavaScript的框架. 二.简单介绍 Bootstrap框架是属 ...
- J2EE 邮件发送那些事儿
距离自己写的关于java邮件发送的第一篇博客已经有很长一段时间了,现在回过头看看.虽然代码质量方面有待提高,整体结构也不怎样,但是基本思路和过程还是比较纯的.现在有空写写J2EE中邮件发送的开发,实际 ...
- FFmpeg学习4:音频格式转换
前段时间,在学习试用FFmpeg播放音频的时候总是有杂音,网上的很多教程是基于之前版本的FFmpeg的,而新的FFmepg3中audio增加了平面(planar)格式,而SDL播放音频是不支持平面格式 ...