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

来源:互联网 发布:简谱制作软件安卓版 编辑:程序博客网 时间:2024/06/01 10:36

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();}}
测试代码:

@Testpublic 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
原创粉丝点击