前言:
在hibernate总结(一)——hibernate入门最后的测试代码中用到了hibernate的相关API,如Configuration、SessionFactory、Session、Transaction,接下来一起来对他们进行了解。
1、Configuration:配置对象
Configuration主要用于Hibernate框架加载映射文件
加载核心配置文件:
在使用hibernate时,首先要创建Configuration实例,Configuration实例主要用于启动、加载、管理hibernate的配置文件信息。在启动的hibernate的过程中,Configuration实体首先确定hibernate配置文件的位置,然后读取相关配置,最后创建一个唯一的SessionFactory实例。Configuration对象只存在于系统的初始化阶段,它将SessionFactory创建完成后,就完成了自己使命。
hibernate通常使用Configuration config=new Configuration.configure();的方式创建实例,此种默认会去src下读取hibernate.cfg.xml配置文件。如果不想使用默认的hibernate.cfg.xml配置文件,自己如果指定目录的话,需要向configure()方法中传递一个文件路径的参数,Configuration config=new Configuration.configure("xml文件位置");
这样的话,hibernate会去指定位置查找配置文件。
加载映射文件:
hibernate除了可以使用Configuration对象加载核心配置文件外,还可以利用该对象加载映射文件。因为使用properties文件做配置文件的话,其他的属性可以使用key=value的格式去设置,但是映射文件没有办法加载。这时这个对象就没发使用了。可以在手动编写代码的时候去加载映射文件。
Configuration config=new Configuration.configure("xml文件位置");
config.addResource("cn/ytm/domain/Customer.hbm.xml");
2、SessionFactory:Session工厂对象
SessionFactory接口负责hibernate的初始化和建立session对象。它在hibernate中起到了一个缓冲区作用,Hibernate可以将自动生成的SQL语句、映射数据以及某些可重复利用的数据放在这个缓冲区中,同时还保存了对象数据库配置的映射关系,维护当前的二级缓存。
SessionFactory实例是通过Configuration对象获取的。
SessionFactory sessionFactory=config.buildSessionFactory();
特点:
1)它是线程安全的,同一个实例能够供多个线程共享。
2)它是重量级的,不能随意的创建和销毁它的实例。
所以,一般情况下,一个项目中只需要一个SessionFactory,只有当应用中存在多个数据源时,才为每一个数据源建立以SessionFactory实例。因此,在项目中,通常会抽取出一个HibernateUtils工具类用来提供session对象。
public class HibernateUtils {
private static final Configuration configuration;
private static final SessionFactory sessionFactory;
static{
configuration=new Configuration().configure();
sessionFactory=configuration.buildSessionFactory();
}
public static Session openSession(){
return sessionFactory.openSession();
}
}
SessionFactory内部还维护了一个连接池,可使用C3P0,配置C3P0内容如下:
引入c3p0相关jar包:
<!--C3P0配置 -->
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<!-- 在连接池中可用数据库连接的最大数目 -->
<property name="hibernate.c3p0.max_size">20</property>
<!-- 在连接池中可用数据库连接的最小数目 -->
<property name="hibernate.c3p0.min_size">5</property>
<!-- 设定数据库连接的过期时间,以秒为单位 -->
<!-- 如果连接池中的某个数据库连接处于空闲状态的时间超过了timeout时间,就会从连接池中清除 -->
<property name="hibernate.c3p0.timeout">120</property>
<!-- 每3000秒检查所有连接池中的空闲连接,一秒为单位 -->
<property name="hibernate.c3p0.idle_test_period">3000</property>
3、Session
Session是应用程序与数据库之间交互操作的一个单线程对象,是Hibernate运作的中心。
主要功能:为持久化对象提供创建、读取和删除的能力,所有持久化对象必须在session的管理下才可以进行持久化操作。
创建SessionFactory实例后,就可以通过它获取Session实例,获取session实例有两种方法,一是通过openSession()方法,另一种是getCurrentSession()方法。两种方法代码:
//采用openSession方法创建session
Session session=sessionFactory.openSession();
//采用getCurrentSession()方法创建session
Session session=sessionFactory.getCurrentSession();
主要区别:
采用openSession方法获取session实例时,SessionFactory直接创建一个新的Session实例,并且在使用完成后需要调用close方法进行手动关闭。而getCurrentSession方法创建的Session实例会被绑定到当前线程中,它在提交或回滚时会自动关闭。
Session是线程不安全的,多个并发线程同时操作一个Session实例时,就可能导致Session数据存取混乱。
它是轻量级的,有缓存,即hibernate的一级缓存。
提供的方法:
1)save()、update()、saveOrUpdate()方法:用于增加和修改对象
2)delete()方法:用于删除对象
3)get()和load()方法:根据主键查询
4)createQuery()方法和createSQLQuery()方法:用于数据库操作对象
5)createCriteria()方法:条件查询。
4、Transaction
Transaction接口主要用于管理事务,它是hibernate的数据库事务接口,且对底层的事务接口进行了封装。Transaction接口的事务对象是通过session对象开启的。
Transaction tx = session.beginTransaction();
方法:
1)commit()方法:提交相关连的session实例
2)rollback()方法:撤销事务操作。即事务回滚。
总结:
这些接口都是hibernate的基础,在使用给的过程中可以重点理解和掌握,小编在这里做简单的介绍,希望对大家有帮助。有问题还望斧正!