Hibernate常用的接口和类Configuration&SessionFactory(三)

Hibernate的API一共有6个,分别为:Session、SessionFactory、Transaction、Query、Criteria和Configuration。通过这些接口,可以对持久化对象进行存取、事务控制。

一、Configuration类

1.1  主要作用

Configuration对象用于配置并且启动Hibernate。
Hibernate应用通过该对象来获得对象-关系映射文件中的元数据,以及动态配置Hibernate的属性,然后创建SessionFactory对象。
简单一句话:加载Hibernate的配置文件,可以获取SessionFactory对象。

1.2 其他应用

加载配置文件的种类,Hibernate支持xml和properties类型的配置文件,在开发中基本都使用XML配置文件的方式。
如果采用的是properties的配置文件,那么通过Configuration configuration = new Configuration();就可以假装配置文件,但是需要自己手动加载映射文件。
例如:config.addResource("cn/itcast/domain/Student.hbm.xml");


此外,如果采用的XML的配置文件,通过Configuration configuration = new Configuration().configure();加载配置文件。这叫做方法链编程。

二、SessionFactory

SessionFactory是数据库编译后的内存镜像,通常一个应用对应一个SessionFactory对象。SessionFactory由Configuration对象生成,Configuration对象负责加载hibernate配置文件。

SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。

SessionFactory并不是轻量级的,意味着它的创建和销毁是需要消耗一些资源的,我们不要随意的去创建和销毁它。

在web项目中,当服务器启动的时候就把它创建好,Spring做这件事情。

是工厂类,是生成Session对象的工厂类
SessionFactory类的特点
由Configuration通过加载配置文件创建该对象。
SessionFactory对象中保存了当前的数据库配置信息和所有映射关系以及预定义的SQL语句。同时,SessionFactory还负责维护Hibernate的二级缓存。
* 预定义SQL语句
* 使用Configuration类创建了SessionFactory对象时,已经在SessionFacotry对象中缓存了一些SQL语句
* 常见的SQL语句是增删改查(通过主键来查询)
* 这样做的目的是效率更高
* 一个SessionFactory实例对应一个数据库,应用从该对象中获得Session实例。
* SessionFactory是线程安全的,意味着它的一个实例可以被应用的多个线程共享。
* SessionFactory是重量级的,意味着不能随意创建或销毁它的实例。如果只访问一个数据库,只需要创建一个SessionFactory实例,且在应用初始化的时候完成。
* SessionFactory需要一个较大的缓存,用来存放预定义的SQL语句及实体的映射信息。另外可以配置一个缓存插件,这个插件被称之为Hibernate的二级缓存,被多线程所共享。
* 一般应用使用一个SessionFactory,最好是应用启动时就完成初始化。


注意:我们引入了映射配置文件。那么,这个对象的简单的crud sql语句都缓存在了SessionFactory对象中。为什么要缓存呢?为了效率。如果不缓存,那么每次crud都要生成一条sql,很慢的。


每次要操作数据库的时候,SessionFactory就创建一个session,会话完成之后,session就会销毁。所以,session的生命周期是很短暂的。session提供了缓存。但是,如果,销毁之后,还想要把一些对象缓存,那么就把这个对象放到SessionFactory中(二级缓存)。因为SessionFactory活得比较久。由于许多session都共享SessionFactory,所以,SessionFactory有策略保证SessionFactory是线程安全的。

由于我们不要轻易的创建和销毁SessionFactory,那么我们可以对hibernate入门案例(一)的程序进行一些修改。

创建一个工具类HibernateUtils

package com.hib.utils;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

/**
 * hibernate框架的工具类
 *
 */
public class HibernateUtils {
	private static final Configuration CONFIG;
	private static final SessionFactory FACTORY;

	// 静态代码块,类在加载的时候就会执行
	static {
		// 加载xml的配置文件
		CONFIG = new Configuration().configure();
		// 构造工厂
		FACTORY = CONFIG.buildSessionFactory();
	}

	public static Session getSession() {
		return FACTORY.openSession();
	}
}
测试代码:
	@Test
	public void testSave2() {
		Session session = HibernateUtils.getSession();
		Transaction tx = session.beginTransaction();
		User user = new User();
		user.setName("李四");
		user.setAge(34);
		session.save(user);
		// 提交事务
		tx.commit();
		// 释放资源
		session.close();
		//注意:工厂就不要随意关闭了
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值