Hibernate常用API

本文记录Java学习过程中遇到的Hibernate的常用API~

hibernate常用的API有四种,分别是:Configuration、SessionFactory、Session和Transaction。

Configuration

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

示例代码:

// 加载src下面的hibernate.cfg.xml配置文件
Configuration config = new Configuration().config();

// 加载自定义位置的配置文件
Configuration config = new Configuration().config("自定义位置");

// 加载额外的映射文件,适用于properties格式的核心配置文件
config.addResource("xxx/Class.hbm.xml");

SessionFactory

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

示例代码:

SessionFactory sessionFactory = config.buildSessionFactory();

SessionFactory具有如下特点:

  • 它是线程安全的,同一个实例能够提供多个线程共享;
  • 它是重量级的,不能随意的创建和销毁它的实例。

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

示例代码:

public class HibernateUtils {
	private static final SessionFactory sf;
	
	static{
		//1 创建,调用空参构造
		Configuration conf = new Configuration().configure();
		//2 根据配置信息,创建 SessionFactory对象
		 sf = conf.buildSessionFactory();
	}
	
	//获得session => 获得全新session
	public static Session openSession(){
				//3 获得session
				Session session = sf.openSession();
				
				return session;
		
	}
	//获得session => 获得与线程绑定的session
	public static Session getCurrentSession(){
		//3 获得session
		Session session = sf.getCurrentSession();
		
		return session;
	}
	public static void main(String[] args) {
		System.out.println(HibernateUtils.openSession());
	}
	
}

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

<!--配置C3P0连接池-->
<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<!--在连接池中可用的数据库连接的最少数目-->
<property name="c3p0.min_size">5</property>
<!--在连接池中所有数据库连接的最大数目-->
<property name="c3p0.max_size">20</property>
<!--连接的超时时间,单位为秒-->
<property name="c3p0.timeout">120</property>
<!--超时连接的检查时间-->
<property name="c3p0.idle_test_period">3000</property>

Session

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

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

示例代码:

Session session1 = sessionFactory.openSession();
Session session2 = sessionFactory.getCurrentSession();

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

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

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

  • save()、update()和saveOrUpdate()方法:用于增加和修改对象;
  • delete()方法:用于删除对象;
  • get()和load()方法:根据主键查询;
  • createQuery()和createSQLQuery()方法:用于数据库查询对象;
  • createCriteria()方法:条件查询。

Transaction

Transaction接口用于管理事务,它是hibernate的数据库事务接口,并且对底层的事务接口进行了封装。

实例代码:

Transaction transaction = session.beginTransaction();

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

  • commit()方法:提交事务;
  • rollcack()方法:回滚事务。

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

标签: none