HibernateSessionFactory类解析

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;public class HibernateSessionFactory {//表示提供有ThreadLocal类对象保存,适合于进行线程的准确处理private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();private static org.hibernate.SessionFactory sessionFactory;//连接工厂private static Configuration configuration = new Configuration();//读取配置类private static ServiceRegistry serviceRegistry;//服务注册类static {//静态代码块,可以在类加载的时候执行一次try {configuration.configure();//读取配置文件serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();//在静态代码块中准备好了SessionFactory类对象sessionFactory = configuration.buildSessionFactory(serviceRegistry);} catch (Exception e) {System.err.println("%%%% Error Creating SessionFactory %%%%");e.printStackTrace();}}private HibernateSessionFactory() {//构造方法私有化,因为本类不需要实例化对象}/*** 取得Session对象,对象是通过ThreadLocal类取得的,如果没有保存的Session,那么会重新连接* @return Session对象* @throws HibernateException*/public static Session getSession() throws HibernateException {//为防止用户可能重复的使用session对象,是通过保存在ThreadLocal中的session直接使用的Session session = (Session) threadLocal.get();if (session == null || !session.isOpen()) {//如果第一次使用或之前关闭了,那么session为空if (sessionFactory == null) {//此时判断是否存在sessionFactory对象//如果sessionFactory类对象不存在,那么重新创建一个sessionFactory类对象rebuildSessionFactory();}//判断是否取得了session类对象 ,如果取得了,使用openSession()方法打开新sessionsession = (sessionFactory != null) ? sessionFactory.openSession(): null;threadLocal.set(session);//为了防止可能重复使用session,将其保存在ThreadLocal中}return session;}/*** 从新进行SessionFactory类的创建*/public static void rebuildSessionFactory() {try {configuration.configure();serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();sessionFactory = configuration.buildSessionFactory(serviceRegistry);} catch (Exception e) {System.err.println("%%%% Error Creating SessionFactory %%%%");e.printStackTrace();}}/*** 关闭session,一般在业务层中调用* @throws HibernateException*/public static void closeSession() throws HibernateException {Session session = (Session) threadLocal.get();//取得已有的session对象threadLocal.set(null);//清空ThreadLocal类中的保存if (session != null) {//将session进行关闭session.close();}}/*** 取得SessionFactory类的对象,目的是可以进行缓存操作* @return*/public static org.hibernate.SessionFactory getSessionFactory() {return sessionFactory;}/*** 取得Configuration类的对象* @return*/public static Configuration getConfiguration() {return configuration;}}

HibernateSessionFactory类解析相关推荐

  1. RandomAccessFile类解析

    [0]README 0.1) 本文描述转自 core java volume 2, 旨在理解 java流与文件--RandomAccessFile类解析 的相关知识: 0.1) 本文 转自: http ...

  2. @param注解的用法解析_SpringBoot 配置类解析

    本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/NvPO5-FWLiOlrsOf4wLaJA 作者:Li Wanghong SpringBoot ...

  3. Android开发--使用实体类解析JSON文本

    Android开发–使用实体类解析JSON文本 在Android开发过程中,涉及到了API的调用的时候,会返回特定的数据,两个主流返回的数据格式是JSON形式和XML形式.但是相对于XML,JSON数 ...

  4. Java String、StringBuffer、StringBuilder类解析

    String.StringBuffer.StringBuilder类解析 概述 String类:代表字符串. 特点 String实现了Serializable接口,表示String是可序列化的 实现了 ...

  5. Cloudsim 3.0.3中VM调度策略系列类解析(带迁移的策略)

    Cloudsim 3.0.3中VM调度策略系列类解析(带迁移的策略) 注:本文为旧文的markdown重制版 Cloudsim中VM调度策略类在DataCenter(或PowerDataCenter) ...

  6. Queue常用类解析之BlockingQueue(二):ArrayBlockingQueue

    Queue常用类解析之PriorityQueue Queue常用类解析之ConcurrentLinkedQueue Queue常用类解析之BlockingQueue(一):PriorityBlocki ...

  7. Spring Boot 整合 SpringDataNeo4j 并封装工具类解析PathValue

    Spring Boot 整合 SpringDataNeo4j 并封装工具类解析PathValue 一.Neo4j 二.Neo4j客户端浏览器 三.maven依赖 四.节点/关系映射 1.NodePer ...

  8. VC解析XML--使用CMarkup类解析XML

    经过今天尝试MFC解析XML串,也算有了不少收获,总结一下.          我是使用的CMarkup类对XML进行操作.                    CMarkup好象都是先从一个xml ...

  9. 【Laravel-海贼王系列】第七章,Pipeline 类解析

    Pipeline Laravel 的中间件是通过管道类来实现的. 通过内核处理请求的过程中管道的作用来解析管道类! protected function sendRequestThroughRoute ...

最新文章

  1. rust 官服指令_RUST 命令大全(包括服务器指令)
  2. python中对文件、文件夹(文件操作函数)的操作
  3. Java把表导出成Excel的代码
  4. 深度剖析 | 初学者应该如何学习前端?该怎么学?
  5. java 8 map reduce_java8之Lambda表达式 4:MapReduce开发案例
  6. MATLAB机器学习决策树网格法优化参数学习笔记
  7. 教学演示软件 模型十二 地理学的水循环模型
  8. 以后不该吃的不能吃了。。。
  9. 所有文件夹变成快捷方式之“1KB文件夹快捷方式病毒”清除
  10. Linux为什么不怕病毒
  11. XR872图传声传小例程——无线传输
  12. 最新30个漂亮的个人作品集网页设计案例
  13. 几乎所有的互联网公司都在进行一场脱虚向实的全新嬗变
  14. char和varchar的区别是什么?
  15. 幸运大转盘-jQuery+Java实现的抽奖程序
  16. iOS App 安装包瘦身指南
  17. matlab url什么意思,URL是什么 url是什么意思?
  18. raspberry pi_使用Raspberry Pi为您的娱乐中心构建时钟
  19. 测试基础篇之(postman接口和Fiddler测试)
  20. linux杀毒软件clamav安装

热门文章

  1. APP_CPU使用率
  2. 【知识图谱】【 实践工具 】【Windows】- Protege - graphviz做图形可视化(三)
  3. 会议记录(7月26日——8月25日)
  4. 【论文笔记】Commonsense Knowledge Aware Conversation Generation with Graph Attention
  5. java smtp pop3_手工体验smtp和pop3协议 邮件实现详解(二)
  6. 人工智能的历史、现在与未来
  7. 石家庄较有名气的儿科诊所小孩
  8. Win7关闭休眠方法
  9. Unity3D随意截图并保存
  10. oracle数据库获取UUID