Hibernate之常用API详解

目录

Hibernate常用API详解

Configuration

加载核心配置文件

加载映射文件 

SessionFactory

Session

Transaction


Hibernate常用API详解

  • Configuration

加载核心配置文件

在使用Hibernate时,首先要创建Configuration实例,主要用于启动、加载、管理Hibernate的配置文件信息,在启动Hibernate的过程中,Configuration实例首先确定Hibernate配置文件的位置,然后读取相关配置,最后创建一个唯一的SessionFactory实例。Configuration对象只存在于系统的初始化阶段,它将SessionFactory创建完成后就完成了自己的使用

        Configuration config = new Configuration().configure();  //默认会去src下读取hibernate.cfg.xml配置文件

Hibernate通常使用以上的方式创建实例,此种方式默认会去src下读取hibernate.cfg.xml配置文件。如果不想使用默认的hibernate.cfg.xml配置文件,则需要向configure()方法中传递一个文件路径的参数

     Configuration config = new Configuration().configure("xml文件位置");  //会去指定位置查找配置文件

     Configuration config = new Configuration().configure("/config/hibernate.cfg.xml");  //会去找src下config包下配置文件

加载映射文件 

Hibernate除了可以使用Configuration对象加载核心配置文件以外,还可以利用该对象加载映射文件。因为如何使用properties文件作为Hibernate的核心配置文件,其他的属性可以使用key=value的格式来设置,但是映射没有办法加载。这时,这个对象就可以派上用场,可以在手动编写代码的时候去加载映射文件

     Configuration config = new Configuration().configure("xml文件位置");  //会去指定位置查找配置文件

     config.addResource("com/mark/domain/Customer.hbm.xml");

  • SessionFactory

SessionFactory接口负责Hibernate的初始化和建立Session对象。它在Hibernate中起到一个缓冲区作用,Hibernate可以将自动生成的SQL语句、映射数据以及某些可以重复利用的数据放在这个缓冲区中。同时,它还保存了对数据库配置的所有映射关系,维护了当前的二级缓存

SessionFactory实例是通过Configuration对象获取的,其获取方法如下

        SessionFactory sessionFactory = config.buildSessionFactory();

SessionFactory具有以下特点:

(1)它是线程安全的,它的同一实例能够供多个线程共享

(2)它是重量级的,不能随意的创建和销毁它的实例

由于SessionFactory的这些特点,一般情况下,一个项目中只需要一个SessionFactory,只有当应用中存在多个数据源时,才为每个数据源建立一个SessionFactory实例。因此,在实际项目中,通常会抽取出一个HibernateUtils的工具类,用来提供Session对象

HibernateUtils

public class HibernateUtil {

	// 会话工厂,以单例方式管理
	private static SessionFactory sessionFactory;

	// ThreadLocal存储session
	private static ThreadLocal<Session> session = new ThreadLocal<Session>();


	// 以单例方式管理sessionFactory
	static {
		try {
			sessionFactory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory();
		} catch (HibernateException e) {
			e.printStackTrace();
			throw new HibernateException("初始化会话工厂失败!");
		}

	}
	//得到一个单例的会话工厂
	public static SessionFactory getSessionFactory(){
		return sessionFactory;
	}
	//获取一个新session
	public static Session openSession(){
		return sessionFactory.openSession();
	}
	
/*	获取当前与线程绑定的session,如果获取不到则创建一个新session并与当前线程绑定
	public static Session getCurrentSession() throws HibernateException {
		//获取当前线程绑定的session
		Session s = (Session) session.get();
		if (s == null) {
			//创建一个新session
			s = sessionFactory.openSession();
			//新session并与当前线程绑定
			session.set(s);
		}
		return s;
	}*/
 
	public static Session getCurrentSession() throws HibernateException {
		return sessionFactory.getCurrentSession(); 
	}
/*	关闭当前线程绑定的session
	public static void closeSession() throws HibernateException {
		//获取当前线程绑定的session
		Session s = (Session) session.get();
		if (s != null){
			//关闭session
			s.close(); 
		}
		session.set(null);
	}*/
	
	public static void closeSession() throws HibernateException {
		sessionFactory.getCurrentSession().close();
	}


}

 SessionFactory内部还维护了一个连接池,如果我们需要使用第三方的连接池如C3P0,那么需要我们手动进行配置

        <!--配置C3P0连接池-->
        <property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
        <!--在连接池中可用的数据库连接的最大数目-->
		<property name="c3p0.max_size">500</property>
		<!--在连接池中可用的数据库连接的最小数目-->
        <property name="c3p0.min_size">20</property>
        <!--设定数据库连接的过期时间,以秒为单位,如果连接池中某额数据库连接处于空闲状态的时间超过了timeout时间,就会从连接池中清除-->
        <property name="c3p0.timeout">2000</property>
		<!--每2000秒检查所有连接池中的空闲连接,以秒为单位-->
        <property name="c3p0.idle_test_period">2000</property>
  • Session

Session是应用程序与数据库之间交互操作的一个单线程对象,是Hibernate运作的中心,它的主要功能是为持久化对象提供创建、读取和删除的能力,所有持久化对象必须在session的管理下才可以进行持久化操作。

创建SessionFactory实例后,就可以通过它获取Session实例。获取Session实例有两种方式,一种是通过openSession()方法,另一种是通过getCurrentSession()方法

        Session session = sessionFactory.openSession();   // 采用openSession()方法

        Session session = sessionFactory.getCurrentSession();   // 采用getCurrentSession()方法

以上两种获取session实例方式的主要区别是,采用openSession方法获取Session实例时,SessionFactory直接创建一个新的Session实例,并且在使用完成后需要调用close方法进行手动关闭。而getCurrentSession方法创建的Session实例会被绑定到当前线程中,它在提交或回滚操作时会自动关闭。

Session是线程不安全的,多个并发线程同时操作一个Session实例时,就可能导致Session数据存取的混乱(方法内部定义和使用Session时,不会出现线程问题)。因此设计软件架构时,应避免多个线程共享一个Session实例。同时,它也是轻量级的,实例的创建和销毁不需要消耗太多的资源。它还有一个缓存,即Hibernate的一级缓存,这个缓存主要用于存放当前工作单元加载的对象。

在Session中提供了大量的常用方法,具体如下

1. save、update和saveOrUpdate方法    :用于增加和修改对象

2. delete方法                                           :用于删除对象

3. get和load方法                                     :根据主键查询

4. createQuery和createSQLQuery方法  :用于数据库操作对象

5. createCriteria方法                               :条件查询

  • Transaction

Transaction接口主要用于管理事务,它是Hibernate的数据事务接口,且对底层的事务接口进行了封装。Transaction接口的事务对象是通过Session对象开启的,其开启方式如下

        Transaction trans = session.beginTransaction();

在Transaction接口中,提供了事务管理的常用方法,具体如下

    1. commit方法:提交相关联的session实例

    2. rollback方法:撤销事务操作

Session执行完数据库操作后,要使用Transaction接口的commit()方法进行事务提交,才能真正的将数据操作同步到数据库中。发生异常时,需要使用rollback()方法进行事务回滚,以避免数据发生错误。因此,在持久化操作后,必须调用Transaction接口的commit()方法和rollback()方法。如果没有开启事务,那么每个Session的操作,都相当于一个独立的操作。

猜你喜欢

转载自blog.csdn.net/mmake1994/article/details/81482378
今日推荐