1. 介绍
代表Hibernate应用程序和数据库之间的一次会话,作用相当于JDBC中的Connection。
- Session接口是Hibernate向应用程序提供的操纵数据库的最主要的接口,它提供了基本的保存、更新、删除和加载Java对象的方法。
- 每一个Session对象都在内存中维护了一个缓存,位于缓存中的对象称为持久化对象,它和数据库表中的相关记录保持着一种对应关系。通过Session缓存,Hibernate最大限度的减少了应用程序访问数据库的次数,实现了对内存空间更加有效的利用。
- Hibernate把持久化类的对象分为4种状态:持久化状态、临时状态、游离状态、删除状态。Session的特定方法能使对象从一个状态转换到另一个状态。
- 在应用系统开发过程中,使用缓存往往是提升程序性能的主要手段。在Hibernate中,Session对象维护的是一个线程级的一级缓存,SessionFactory维护了一个进程级别的二级缓存。
2. 好处
- 减少访问数据库的次数:两次调用session.get(Student.class,1);方法,仅发送1条SQL语句。原因是第一次使用get()方法加载的Student被缓存到了内存中,第二次调用get()方法直接使用了内存中缓存的Student对象,从而减少了访问数据库的次数。
- 将内存中数据的变化自动同步到数据库中:使用session.get(Student.class,1);方法将一个Student对象加载到内存中后,Student对象就处于Session对象的管理中。此时调用student.setStuName(“a”);方法将触发Hibernate对数据库表中对应数据记录的修改,即发送一条UPDATE语句,更新Student对象在数据库表中对应的记录。
- Hibernate最大的特点就是将对数据库记录的操作,转换为对Java对象的操作,简化开发
3. SessionFactory
- SessionFactory 相当于java web连接池,用于管理所有session
- 获得SessionFactory 方式:config.buildSessionFactory();
- sessionFactory 还用于缓存配置信息 (数据库配置信息、映射文件,预定义HQL语句 等)
- SessionFactory线程安全,多个线程同时访问时,不会出现线程并发访问问题。
4. 获取session
//1.获取核心 配置文件对象,默认是加载src的hibernate.cfg.xm文件
Configuration cfg = new Configuration().configure();
//2.创建会话工厂
SessionFactory factory = cfg.buildSessionFactory();
//获取一个全新的session
factory.openSession()
// 获取一个与当前线程绑定的session
factory.getCurrentSession()
要使用这个方法必须在hibernate.cfg.xml中配置
<property name="hibernate.current_session_context_class">thread</property>
hibernate支持,将创建的session绑定到本地线程中,底层使用ThreadLocal,在程序之间共享session。
如果提交或者回滚事务,底层将自动关闭session
public class HibernateUtils {
private static SessionFactory sf;
static{
//1.加载配置
Configuration cfg = new Configuration().configure();
//2.创建一个sessionFactory
sf = cfg.buildSessionFactory();
//3.在虚拟机关闭时,释放SessionFactory
Runtime.getRuntime().addShutdownHook(new Thread(){
@Override
public void run() {
sf.close();
System.out.println("释放资源");
}
});
}
public static Session openSession(){
return sf.openSession();
}
public static Session getCurrentSession(){
return sf.getCurrentSession();
}
}
5. 缓存
在应用系统开发过程中,使用缓存往往是提升程序性能的主要手段。在Hibernate中,Session对象维护的是一个线程级的一级缓存,SessionFactory维护了一个进程级别的二级缓存。