Erlo

Hibernate工具类_抽取重复核心代码

2019-04-25 21:01:52 发布   120 浏览  
页面报错/反馈
收藏 点赞

问题:在Hibernate中每次执行一次操作总是需要加载核心配置文件,获取连接池等等都是重复动作,所以抽取出来

解决:

package com.xxx.utils;
/**
*Hibernate的工具类
*@author cxh
*/

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HiberUtils {
//    1.创建一个session回话工厂,以单例模式管理(简单的获取session第一种)
    private static SessionFactory sessionFactory;
    
//    2.ThreadLocal存储session,一开始直接将session绑到当前线程,后面直接来获取线程中的session(第二种)
    private static ThreadLocal<Session> currentSession = new ThreadLocal<Session>(); 
    
    //初始化获取session会话工厂
    static {
        try {
            sessionFactory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory();
        } catch (HibernateException e){
            e.printStackTrace();
            throw new HibernateException("初始化会话工厂失败");
        }
    }
    
//    获取单例会话工厂
    public SessionFactory getSessionFactory() {
        return sessionFactory;
    }
    
//    获取session对象
    public static Session openSession() {
        return sessionFactory.openSession();
    }
    
//    获取绑定到线程里面的session,如果获取不到就创建一个新的线程去绑定session
    public Session getCurrentThreadSession() {
//        获取线程中的session
        Session s = currentSession.get();
        if(s == null) {
//            创建一个新的session
            s = sessionFactory.openSession();
//            将新的session与当前线程绑定
            currentSession.set(s);
        }
//        不为空,当前线程有session,直接返回
        return s;
    }
    
//    关闭当前线程的session
    public static void closeCurrentThreadSession() {
//        获取当前线程绑定的session对象
        Session s = currentSession.get();
//        当前线程有session对象,且该对象不为空,需要关闭
        if(s != null) {
            s.close();
        }
        currentSession.set(null);
    }
    
//    3.hibernate中底层已经帮你封装了将session与当前线程绑定的方法
    public static Session getCurrentSession() {
        return sessionFactory.getCurrentSession();
    }
    
    //上面两种获取线程里面的session都可以直接调用该封装方法进行关闭
    public static void closeSession() throws HibernateException {
        sessionFactory.getCurrentSession().close();
    }
    
}

 

  

登录查看全部

参与评论

评论留言

还没有评论留言,赶紧来抢楼吧~~

手机查看

返回顶部

给这篇文章打个标签吧~

棒极了 糟糕透顶 好文章 PHP JAVA JS 小程序 Python SEO MySql 确认