Hibernate旅程(二)Hibernate实例(二)

2014-11-24 02:40:39 · 作者: · 浏览: 1
commit(); }catch( Exception e) { e.printStackTrace(); //回滚事务. session.getTransaction().rollback(); }finally{ if(session!=null) { if(session.isOpen()) { //关闭session. //hibernate中已经将connection的的关闭封装了. //我们没有看到任何一条sql语句. session.close(); } } } } }

(8) 加入log4j配置文件,将该配置文件拷贝到我们自己项目的src下,便于调试和跟踪。

(9)建立自己的数据库,执行ExportDB.java生成数据库中的表,执行client.java完成了对象与关系数据库表的对应,如下图3.2,建立的User表。

\

图3.2

Configuration类

上述代码中,Configuration类负责管理Hibernate的配置信息,一个Configuration类的实例代表了应用程序中java类到数据库映射的集合。我们创建一个Configuration实例,并通过这个实例创建SessionFactory实例。 //默认读取的是hibernate.cfg.xml文件.

Configurationcfg = new Configuration().configure();

//建立SessionFactory.

SessionFactoryfactroy = cfg.buildSessionFactory();

在这里默认读取的是hibernate.cfg.xml文件,在新建一个Configuration的实例时,Hibernate会在类路径中查找hibernate.properties文件和hibernate.cfg.xml文件,如果两个文件同时存在,则hibernate.cfg.xml将覆盖hibernate.properties文件。如果两个文件都不存在则抛出异常。我们也可以指定配置文件的路径,不用系统默认的hibernate.cfg.xml文件:Stringfilename= “my_hibernate_cfg.xml” Configuration config = new Configuration().configure(filename);


Hibernate配置文件

从配置文件中可以看出,这个配置文件描述的是数据库的信息,如数据库看的URL、用户名、密码,hibernate使用方言(那种数据库),同时还可以管理数据库中各个表的映射文件,还可以配置事务策略等。


SessionFactory类

SessionFactory负责Session实例的创建,为了创建一个SessionFactory对象,必须在Hibernate初始化的时候创建一个Configuration类的实例,并将已经写好的映射文件交给它处理。这样Configuration对象就可以创建一个SessionFactory对象,当SessionFactory对象创建成功后,Configuration对象就没用过了。SessionFactory是线程安全的,可以被多个单线程调用以取得session对象,而构造SessionFactory要消耗资源,所以多数情况下一个应用中只初始化一个SessionFactory,在这里我们可以考虑使用静态方法,来解决这个问题。在上述代码的基础上我们抽取出一个工具类,用来专门实例化工厂管理session,并且采用static每次只初始化一次,代码如下所示。

package com.bjpowernode.hibernate;

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

public class HibernateUtils {
	
	private static SessionFactory factory;

	//static只初始化一次.
	static
	{
		try{
		//默认读取的是hibernate.cfg.xml 文件.
				Configuration cfg = new Configuration().configure();
				
				//建立SessionFactory.
				factory = cfg.buildSessionFactory();
	
		}catch(Exception e )
		{
			e.printStackTrace();
		}
	}
	
	public static Session getSession()
	{
		//打开session.
		return factory.openSession();
	}
	
	//关闭session.
	public static void closeSession(Session session)
	{
		//判断是否为空.
		//判断是否是打开状态再进行关闭.
		
		if(session!=null)
		{
			if(session.isOpen())
			{
				session.close();
			}
		}
	}
	
	//返回工厂类.
	public static SessionFactory getSessionFactory()
	{
		return factory;
	}
}
	

Session

Session是Hibernate运作的核心,对象的声明周期、事务的管理以及数据库的存取都与它息息相关。Session是由SessionFactory创建的,SessionFactory是线程安全的,而Session不是线程安全的,所以让多个线程共享一个session,会引起冲突。

下一篇Hibernate持久化对象的三个状态。