Java Hibernate使用SessionFactory创建Session案例详解

 更新时间:2021年08月26日 10:36:27   作者:xueliangfei  
这篇文章主要介绍了Java Hibernate使用SessionFactory创建Session案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    SessionFactory在Hibernate中实际上起到了一个缓冲区的作用 他缓冲了HIbernate自动生成SQL语句和其他的映射数据 还缓冲了一些将来有可能重复利用的数据
    为了能创建一个SessionFactory对象 应该在Hibernate初始化的时候创建一个Configuration类的实例 并将已经写好的映射文件交给他处理 这样Configuration对象就可以创建一个SessionFactory对象 当SessionFactory对象创建成功后 Configuration对象就没用用了 就可以简单的抛弃他
示例代码:
Configuration cfg = new Configuration();
cfg.addResource("com/demo/hibernate/beans/User.hbm.xml");
cfg.setProperty(System.getProperties());
SessionFactory sessionFactory = cfg.buildSessionFactory();

SessionFactory用到了一个设计模式 工厂模式 用户程序从工程类SessionFactory取得Session实例 设计者的意图就是让它能在整个应用中共享 典型的来说 一个项目通常只需要一个SessionFactory就够了 因此我们就设计了HibernateSessionFactory.java这个辅助类 定义了一个静态的Configuration和SessionFactory对象

private static final Configuration cfg = new Configuration();
private static org.hibernate.SessionFactory sessionFactory;

这两个对象对整个应用来说只有一个实例存在 因此为用户的访问定义一个本地线程变量:

private static final ThreadLocal threadLocal = new ThreadLocal();

该线程变量是静态的 对每一个访问该线程的用户产生一个实例 这样在要取得Session对象时 首先从当前用户的线程中取得Session对象 如果还没有创建 则从SessionFactory中创建一个Session 此时会判断SessionFactory对象是否已经创建 该对象对这个应用来说 只有一个 因此 只有第一次访问该变量的用户才会创建该对象

HibernateSessionFactory.java 取得Session对象的过程如下表示

public static Session currentSession() throws HibernateException {
        Session session = (Session) threadLocal.get();

        if (session == null) {
            if (sessionFactory == null) {
                try {
                    cfg.configure(CONFIG_FILE_LOCATION);
                    sessionFactory = cfg.buildSessionFactory();
                }
                catch (Exception e) {
                    System.err.println("%%%% Error Creating SessionFactory %%%%");
                    e.printStackTrace();
                }
            }
            session = sessionFactory.openSession();
            threadLocal.set(session);
        }

        return session;
    }

首先判断threadLocal中是否存在Session对象 如果不存在 则创建Session对象 在创建Session对象时 首先要判断系统是否已经加载Configuration 如果没有sessionFactory 则需要先创建该对象 创建完成的Session对象 需要保存在threadLocal中以供本次访问线程的下一次调用

在关闭Session对象是 只需要从当前线程中取得Session对象 关闭该对象 并置空本地线程变量即可

public static void closeSession() throws HibernateException {
        Session session = (Session) threadLocal.get();
        threadLocal.set(null);

        if (session != null) {
            session.close();
        }
    }

到此这篇关于Java Hibernate使用SessionFactory创建Session案例详解的文章就介绍到这了,更多相关Java 使用SessionFactory创建Session内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • idea中创建新类时自动添加注释的实现

    idea中创建新类时自动添加注释的实现

    在每次使用idea创建一个新类时,过了一段时间发现看不懂这个类是用来干嘛的,为了解决这个问题,我们可以设置在创建一个新类时自动添加注释,帮助我们理解这个类的用处,本文主要介绍了在idea中创建新类时自动添加注释的实现,感兴趣的可以了解一下
    2025-03-03
  • Java如何实现Word文档分栏效果

    Java如何实现Word文档分栏效果

    这篇文章主要介绍了Java如何实现Word文档分栏效果,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Java多态(动力节点Java学院整理)

    Java多态(动力节点Java学院整理)

    多态是指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。接下来通过本文给大家介绍java多态相关知识,感兴趣的朋友一起学习吧
    2017-04-04
  • Java Exception 捕获和显示实例详解

    Java Exception 捕获和显示实例详解

    这篇文章主要介绍了Java Exception 捕获和显示实例详解的相关资料,需要的朋友可以参考下
    2017-03-03
  • 详细介绍Spring的配置文件

    详细介绍Spring的配置文件

    这篇文章主要为大家详细介绍了Spring中的配置文件的命名以及它的配置文件都有些什么。文中的示例代码讲解详细,感兴趣的小伙伴可以跟上小编一起学习一下
    2022-10-10
  • Java中数据转换及字符串的“+”操作方法

    Java中数据转换及字符串的“+”操作方法

    本文主要介绍了Java中的数据类型转换,包括隐式转换和强制转换,隐式转换通常用于将范围较小的数据类型转换为范围较大的数据类型,而强制转换则是将范围较大的数据类型转换为范围较小的数据类型,本文介绍Java中数据转换以及字符串的“+”操作,感兴趣的朋友一起看看吧
    2024-10-10
  • 基于Restful接口调用方法总结(超详细)

    基于Restful接口调用方法总结(超详细)

    下面小编就为大家带来一篇基于Restful接口调用方法总结(超详细)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Jackson java动态去除返回json中的值方式

    Jackson java动态去除返回json中的值方式

    文章介绍了在Java中使用@JsonInclude注解动态去除返回JSON中的非必需字段(如分页信息)的解决方案,通过在字段上添加@JsonInclude注解并选择合适的策略(如NON_NULL或NON_EMPTY),可以在非分页情况下取消分页字段,从而提高返回结果的灵活性和效率
    2024-12-12
  • Spring中的父子容器原理解析

    Spring中的父子容器原理解析

    这篇文章主要为大家介绍了Spring中的父子容器原理解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • MybatisPlus中@TableField注解的使用详解

    MybatisPlus中@TableField注解的使用详解

    这篇文章主要介绍了MybatisPlus中@TableField注解的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09

最新评论