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 static SessionFactory getSessionFactory() {
return sessionFactory;
} // 获取session对象
public static Session openSession() {
return sessionFactory.openSession();
} // 获取绑定到线程里面的session,如果获取不到就创建一个新的线程去绑定session.这里面要想session对象的生命周期与当前线程绑定,还需要在hibernate配置文件里面配置current_session_context_class属性,设置为thread
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工具类_抽取重复核心代码的更多相关文章
- iOS开发--换肤简单实现以及工具类的抽取
一.根据美工提供的图片,可以有两种换肤的方案. <1>美工提供图片的类型一: <2>美工提供图片的类型二:这种分了文件夹文件名都一样的情况,拖入项目后最后用真实文件夹(蓝色文件 ...
- Hibernate.基础篇《一》.Hibernate工具类.
Hibernate.基础篇<一>.Hibernate工具类. 话述: Hibernate.基础篇第一篇,前面是代码.后面再加理论&实践. Hibernate使用的版本是:5.x,在 ...
- 获取全局上下文(getApplicationContext)_创建Shared Preference工具类_实现自动登录
获取全局上下文(getApplicationContext)_创建Shared Preference工具类_实现自动登录 ===========================获取全局上下文(getA ...
- hibernate工具类
因为hibernate的代码大部分都是固定的,为了将减少重复的代码的书写,可以将这些代码封装为一个工具类,获取hibernate的session对象. 1.工具类: package pers.zhb. ...
- hibernate工具类HibernateUtil详解
1.为什么要用hibernateUtil这个类,先看这段代码: //加载配置文件信息默认为hiberna.cfg.xml,如果不是的话那么就在config()方法里面去解析他 Con ...
- Hibernate 工具类
1.HibernateConfigUtil.java(HIbernate配置工具类) import org.hibernate.Session; import org.hibernate.Sessio ...
- 【JDBC】工具类的抽取
jdbc.properties属性文件 driverClass=com.mysql.jdbc.Driver url=jdbc:mysql:///jdbctest username=root passw ...
- Android开发之封装log打印日志的工具类,实用logutils详细代码
public final class LogUtil { /** all Log print on-off */ private final static boolean all = true; /* ...
- Java工具类_表结构自动生成对应的实体类、Mapper.xml文件、Dao类
import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWrit ...
随机推荐
- git基础命令学习总结
git版本升级 git clone git://git.kernel.org/pub/scm/git/git.git 列出所有 Git 当时能找到的配置 git config --list git c ...
- java I/O流详解
概况 I/O流主要分为二大类别:字符流和字节流. 字节流(基本流) 1.字节输入流 类名:FileInputStream 特点:读(对文件进行读取操作) 父类:InputStream ...
- React Native在特赞的应用与实践
基于React技术栈构建开发前端项目,并使用React Native开发特赞移动APP 目前正在使用Node.js开发和维护特赞服务网关,希望Node.js能够在更轻量级的微服务架构中发挥重要作用 课 ...
- Oauth2.0 用Spring-security-oauth2
客户端通过appId,redirectUrl,在open platform打开的页面上填写正确的用户名和密码后,open platform验证通过后,会跳转到redirectUrl,此时的redire ...
- 产品 vs 服务,见识,耐心
站在空无一人略有冷意的街头,突然有种恍如隔世的感觉:这就是传说中橘生淮北则为枳的淮北?咦,我为什么会出现在这里? 于是我陷入了深深的思考. 关于对过去的思考 托尔斯泰说过:幸福的家庭是相似的,不幸的家 ...
- redis与python交互
import redis #连接 r=redis.StrictRedis(host="localhost",port=6379,password="sunck" ...
- Android FoldingLayout 折叠布局 原理及实现(一)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/44278417,本文出自:[张鸿洋的博客] 1.概述 无意中翻到的FoldingL ...
- 用Hyperledger Fabric(超级账本)来构建Java语言开发区块链的环境
面向 Java 开发人员的链代码简介 您或许听说过区块链,但可能不确定它对 Java™ 开发人员有何用.本教程将帮助大家解惑.我将分步展示如何使用 Hyperledger Fabric v0.6 来构 ...
- Maven常识
maven下面通常有四个文件夹: src/main/java -- 用来存放业务代码 src/test/java -- 用来存放测试代码 另有两个名为resource的文件夹,通常用来放置前两个文件夹 ...
- return_fun.go 源码阅读
] } else { receive.To = "" } return receive }