第一、前言
阅读本文章之前请先阅读:ORM框架之Hibernate基本入门配置
第二、要解决的问题
让Session对象符合使用原则。即一个线程只能有一个Session。本文将介绍Session和线程绑定的配置和使用细节。
第三、代码示例
首先,复用之前的代码,建一个测试类
package com.demo;
import org.hibernate.Session;
import com.demo.util.HibernateUtil;
/**
* 测试类
* @author shixiangcheng
* 2020-07-04
*/
public class Test {
public static void main(String[] args) {
Session session1=HibernateUtil.openSession();
Session session2=HibernateUtil.openSession();
System.out.println(session1==session2);
}
}
在一个线程里获取两次session,比对两个session是否相同。执行结果如下:
这是因为调用openSession()方法,每次都得到一个新的session对象。现在我们对HibernateUtil.java修改如下:
package com.demo.util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
/**
* Hibernate工具类
* @author shixiangcheng
* 2020-07-04
*/
public class HibernateUtil {
private static SessionFactory factory;
//线程局部变量
private static ThreadLocal<Session> tl=new ThreadLocal<Session>();
static {
try {
//1.解析主配置文件
Configuration cfg=new Configuration();//它只是创建,并不能加载xml配置文件
cfg.configure();//加载默认位置和名称的配置文件(默认位置:类的根路径.默认名称:hibernate.cfg.xml)
//2.根据配置文件创建SessionFactory(线程安全,同步锁)
//使用原则:一个应用应该只有一个SessionFactory,在应用加载时创建,应用卸载时销毁
factory=cfg.buildSessionFactory();
}catch(ExceptionInInitializerError e) {
throw new ExceptionInInitializerError("初始化SessionFactory失败,请检查配置文件!");
}
}
public static Session openSession() {
Session s=tl.get();
if(s==null) {
tl.set(factory.openSession());
}
return tl.get();
}
}
然后再执行上面的测试类,发现返回值是true。这是因为将session对象和线程绑定,同一个线程多次获取的是同一个session对象。
此外,也可以通过配置实现上面的效果,在hibernate.cfg.xml文件中增加一条配置
<!-- 把session和线程绑定,从而实现一个线程只有一个session -->
<property name="current_session_context_class">thread</property>
文件HibernateUtil.java增加方法
/**
* 从当前线程获取session对象
* @return
*/
public static Session getCurrentSession() {
//只有配置了把session和线程绑定之后,才能使用此方法
return factory.getCurrentSession();
}
再次修改测试类
Session session1=HibernateUtil.getCurrentSession();
Session session2=HibernateUtil.getCurrentSession();
System.out.println(session1==session2);
运行得到结果:true
BTW:当把session和线程绑定之后,Hibernate就会在提交或回滚事务之后,自动帮我们关闭session
欢迎大家积极留言交流学习心得,点赞的人最美丽,谢谢