Hibernate通过配置文件构建org.hibernate.Session对象的方式与使用范例源代码

Posted leeon_l

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate通过配置文件构建org.hibernate.Session对象的方式与使用范例源代码相关的知识,希望对你有一定的参考价值。

 Hibernate通过配置文件构建org.hibernate.Session对象的方式
  1、创建 org.hibernate.cfg.Configuration对象configuration;

2、调用configuration对象的configure(path)方法加载配置文件,参数为Hibernate核心配置文件hibernate.cfg.xml的位置路径;

  3、调用加载过配置文件的configuration对象的buildSessionFactory()方法获取org.hibernate.SessonFactory对象sessionFactory;

  4、一般情况下调用sessionFactory对象的openSession()方法获取org.hibernate.Session对象session(特殊情况如本例所示通过ThreadLocal管理session,避免session频繁创建与销毁);
 
 ——————到此,session构建成功,具体使用时还有如下步骤:

  5、涉及事务管理时,调用session的beginTransaction()方法获取org.hibernate.Transaction对象transaction;

  6、进行具体的数据库增删改查操作;

  7、进行事务管理操作,如提交事务transaction.commit();

  8、关闭session,session.close();


HibernateSessionFactory类代码(带详细注释):

<span style="font-size:14px;">import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;

/*
 * Hibernate通过配置文件构建org.hibernate.Session对象的方式
 *	1、创建 org.hibernate.cfg.Configuration对象configuration;
 *	2、调用configuration对象的configure(path)方法加载配置文件,参数为Hibernate核心配置文件hibernate.cfg.xml的位置路径;
 *	3、调用加载过配置文件的configuration对象的buildSessionFactory()方法获取org.hibernate.SessonFactory对象sessionFactory;
 *	4、一般情况下调用sessionFactory对象的openSession()方法获取org.hibernate.Session对象session(特殊情况如本例所示通过ThreadLocal管理session,避免sess<span style="white-space:pre">		</span>ion频繁创建与销毁);
 *
 *	——————到此,session构建成功,具体使用时还有如下步骤:
 *	5、涉及事务管理时,调用session的beginTransaction()方法获取org.hibernate.Transaction对象transaction;
 *	6、进行具体的数据库增删改查操作;
 *	7、进行事务管理操作,如提交事务transaction.commit();
 *	8、关闭session,session.close();
 */
public class HibernateSessionFactory 
	//配置文件位置(相对路径)
	private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";					
	//使用线程局部变量TreadLocal管理session,它为每一个线程提供一个session对象的副本
	//可以结合过滤器实现保持登录状态,结合监听器实现session状态变化与session值的更新
	private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();	
	//用于加载配置文件
	private  static Configuration configuration = new Configuration();
	//声明Hibernate的session工厂类对象
	private static org.hibernate.SessionFactory sessionFactory;
	private static String configFile = CONFIG_FILE_LOCATION;
	//静态块,类加载时执行
	static 
		try 
			//加载配置文件
			configuration.configure(configFile);	
			//创建Hibernate的session工厂对象
			sessionFactory = configuration.buildSessionFactory();		
		 catch (Exception e) 
			//输出错误信息
			System.err.println("%%%% Error Creating SessionFactory %%%%");
			e.printStackTrace();
		
	
	private HibernateSessionFactory() 
	
	//定义获取session对象的方法(通过ThreadLoacl)
	public static Session getSession() throws HibernateException 
		//通过threadLocal的get方法获取当前线程的session对象
		Session session = (Session) threadLocal.get();	
		//判断session状态
		if (session == null || !session.isOpen()) 			
			if (sessionFactory == null) 	
				//重建sessonFactory
				rebuildSessionFactory();
			
			//通过openSession方法获取session对象										
			session = (sessionFactory != null) ? sessionFactory.openSession(): null;
			//将session交由threadLocal管理
			threadLocal.set(session);						
		
		return session;
	
	
	//定义sessionfactory的重建方法
	public static void rebuildSessionFactory() 
		try 
			//再次加载配置文件
			configuration.configure(configFile);
			//再次创建sessionFactory对象
			sessionFactory = configuration.buildSessionFactory();
		 catch (Exception e) 
			//输出错误信息
			System.err.println("%%%% Error Creating SessionFactory %%%%");
			e.printStackTrace();
		
	
	
	//定义session关闭的方法
	public static void closeSession() throws HibernateException 
		//通过threadLocal的get方法获取当前线程的session对象
		Session session = (Session) threadLocal.get();
		//将threadLocal置空
		threadLocal.set(null);
		if (session != null) 
			//关闭session
			session.close();
		
	
	
	//get/set方法
	public static org.hibernate.SessionFactory getSessionFactory() 
		return sessionFactory;
	
	public static void setConfigFile(String configFile) 
		HibernateSessionFactory.configFile = configFile;
		sessionFactory = null;
	
	public static Configuration getConfiguration() 
		return configuration;
	
</span>


在dao层使用方法,student表的一些操作,如下所示:

import java.util.Iterator;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import com.sanqing.hibernate.HibernateSessionFactory;
import com.sanqing.po.Student;
import com.sanqing.po.Subject;

public class StudentDAOImpl implements StudentDAO
	public Student findByStudentID(String studentID) 
		Session session = HibernateSessionFactory.getSession();
		Student student = (Student) session.get(Student.class, studentID);
		HibernateSessionFactory.closeSession();
		return student;
	

	public void updateStudent(Student student) 
		Session session = HibernateSessionFactory.getSession();
		Transaction  transaction = null;
		try
			transaction = session.beginTransaction();
			session.update(student);
			transaction.commit();
		catch(Exception ex) 
			ex.printStackTrace();
			transaction.rollback();
		
		HibernateSessionFactory.closeSession();
	

	public List<Student> findByStudentName(String studentName) 
		Session session = HibernateSessionFactory.getSession();
		Query query = session.createQuery("from Student as stu where stu.studentName = ?");
		query.setString(0, studentName);
		List list = query.list();					
		HibernateSessionFactory.closeSession();		
		return list;
	

	public List<Student> findByStudentClass(String sclass) 
		Session session = HibernateSessionFactory.getSession();
		Query query = session.createQuery("from Student as stu where stu.sclass = ?");
		query.setString(0, sclass);
		List list = query.list();					
		HibernateSessionFactory.closeSession();		
		return list;
	


如果想深入学习SSH框架,可以先参看一个demo: 一个典型的SSH登录与增删改查demo详解+源代码

以上是关于Hibernate通过配置文件构建org.hibernate.Session对象的方式与使用范例源代码的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate通过配置文件构建org.hibernate.Session对象的方式与使用范例源代码

Hibernate Validator简介

基于已构建S2SH项目配置全注解方式简化配置文件

spring.datasource.data 拾取,但脚本从未执行

快速构建hibernate框架

hibernate 中的ORM是如何与数据库实现存储和查询的