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

Posted ends-earth

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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();
    }
    
}

 

  

以上是关于Hibernate工具类_抽取重复核心代码的主要内容,如果未能解决你的问题,请参考以下文章

hibernate核心API使用

网络加载数据及单例工具类的代码抽取

Hibernate_01_初体验

Codeigniter 助手重复 HTML 代码片段

Hibernate_13_QBC查询

Hibernate核心类用法-使用Transaction管理事务