码迷,mamicode.com
首页 > Web开发 > 详细

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

时间:2019-04-25 20:10:03      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:ack   问题   ssi   exce   print   Opens   class   row   cat   

问题:在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工具类_抽取重复核心代码

标签:ack   问题   ssi   exce   print   Opens   class   row   cat   

原文地址:https://www.cnblogs.com/ends-earth/p/10762270.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!