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和数据库表之间的映射,除此之外还提供数据查询和数据获 ...
随机推荐
- 在C#代码中应用Log4Net系列教程(附源代码)
Log4Net应该可以说是DotNet中最流行的开源日志组件了.以前需要苦逼写的日志类,在Log4Net中简单地配置一下就搞定了.没用过Log4Net,真心不知道原来日志组件也可以做得这么灵活,当然这 ...
- Linux简单指令操作
Linux CentOS运维中,常用的操作和命令记录下: 1.DNS设置 在Linux服务器上,当我们ping出现这个错误时:ping: unknown host,很大可能是系统的DNS没有设置或者设 ...
- JavaScript dom 标签属性
节点: 平时开发中常用的节点是: 元素节点:nodeType值是 1 --> <a>,<p>...... 属性节点:nodeType值是 2 --> t ...
- Spark 运行架构核心总结
摘要: 1.基本术语 2.运行架构 2.1基本架构 2.2运行流程 2.3相关的UML类图 2.4调度模块: 2.4.1作业调度简介 2.4.2任务调度简介 3.运行模式 3.1 standalo ...
- Android-环境问题
大家都知道 Android Studio 是 Goole 的亲儿子,但,亲儿子毕竟也是刚出生2年不到,身上大毛病没有,小毛病大一堆,这篇博文就来总结一下常见的Android Studio 的设置,使用 ...
- es6学习笔记
class Point { constructor(x, y) { this.x = x; this.y = y; } static classMethod() { console.log('fath ...
- PHP继承
继承是PHP5面象对象程序设计的重要特性之一,它是指建立一个新的派生类,从一个或多个先前定义的类中继承数据和函数,而且可以重新定义或加进新数据和 函数,从而建立了类的层次或等级. 继承性是子类自动共享 ...
- 关于 WP 开发中.xaml 与.xaml.cs 的关系
今天我们先来看一下在WP8.1开发中最长见到的几个文件之间的关系.比较论证,在看这个问题之前我们简单看看.NET平台其他两个不同的框架: Windows Forms 先看看Window Forms中的 ...
- (转)从P1到P7——我在淘宝这7年
(一) 2011-12-08 [原文链接] 今天有同事恭喜我,我才知道自己在淘宝已经七周年了.很多人第一句话就是七年痒不痒,老实说,也曾经痒过,但往往都是一痒而过,又投入到水深火热的工作中去.回家之后 ...
- 关于gdb和shp的FID问题
gdb的FID从1开始,并且FID唯一,从数字化时开始,每个图形对应唯一的FID,删除图形亦删除对应的FID.FID可能出现中断的情况. shp的FID从0开始,并且永远连续.删除图形,则编号在其下面 ...