欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-07-02 16:42:56
问题:在Hibernate中每次执行一次操作总是需要加载核心配置文件,获取连接池等等都是重复动作,所以抽取出来 解决: ......

问题:在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();
    }
    
}