第一、前言 阅读本文章之前请先阅读: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
欢迎大家积极留言交流学习心得,点赞的人最美丽,谢谢