1.概述:

应用程序从SessionFactory(会话工厂)里获得Session(会话)实例。它在多个应用线程间进行共享。

SessionFactory是线程安全的(Thread-Safe),可以让多个执行线程同时存取SessionFactory而不会有数据共享的问题。

会话工厂缓存了生成的SQL语句和Hibernate在运行时使用的映射元数据。

需要注意的是SessionFactory是重量级的,因为一 般情况下,一个项目通常只需要一个SessionFactory就够(单例模式),当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。

调用代码:

SessionFactory sessionFactory = cfg.buildSessionFactory();

2.概述:

Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流)

Session也称为持久化管理器,因为它是与持久化有关的操作接口。
Session不是线程安全的,应该避免多个线程共享同一个Session实例。
Session通过SessionFactory打开,在所有的工作完成后,需要关闭。
保证在一个线程中仅存在一个Session实例
getCurrentSession (Hibernate 3)
可以采用ThreadLocal的办法. (Hibernate 2)
把Session对象放在方法内部定义.

它与Web层的HttpSession没有任何关系。

3.那么,如何构建单态模式下的SessionFactory?

一种是私有构造方法,提供公共接口。

一种是用静态代码块。

我用的方法是第二种。

所以在项目中,要抽取出一个HibernateUntils工具类,用来提供Session对象。

配置文件等信息请见上次文章代码如下:

package com.utils;import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;public class HibernateUtils {//声明一个私有的静态final类型的Configuration对象private static final Configuration config;//声明一个私有的静态final类型的SessionFactory对象private static final SessionFactory factory;//通过静态代码块构建SessionFactorystatic {           config=new Configuration().configure();factory=config.buildSessionFactory();}//提供一个共有的静态方法供外部获取,并返回一个session对象public static Session getSession(){return factory.openSession();}}
在上述代码中,首先声明了一个私有的静态final类型的Configuration对象和SessionFactory对象,来供类中的其他成员使用,接下来通过静态方法构建SessionFactory实例,最后提供了一个公有的静态方法供外部获取Session对象。通过此工具类,在项目中就可以直接通过HibernateUtils.getSession()的方式获取Session对象。

在测试类中直接引用工具类中的方法:

package com.entity;import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import org.hibernate.SessionFactory;import com.utils.HibernateUtils;public class TestDemo1 {//定义变量Configuration config=null;SessionFactory sessionFactory=null;Session session=null;Transaction transaction=null;@Testpublic void insert(){    try {//直接引用HibernateUtilS工具类中的getSession()方法session=HibernateUtils.getSession();//4.开始事务transaction=session.beginTransaction();//5.操作Customer cus=new Customer();cus.setUsername("小良");cus.setAge(20);cus.setSex("男");cus.setCity("哈尔滨");session.save(cus);//6.提交事务transaction.commit();//7.关闭资源session.close();} catch (HibernateException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//删除操作@Testpublic void delete(){try {//直接引用HibernateUtilS工具类中的getSession()方法session=HibernateUtils.getSession();//4.开始事务transaction=session.beginTransaction();//5.操作//先查询Customer cus=(Customer)session.get(Customer.class,3);//再删除if(cus!=null){session.delete(cus);}//6.提交事务transaction.commit();//7.关闭资源session.close();} catch (HibernateException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//查询操作  @Testpublic void select(){try {//直接引用HibernateUtilS工具类中的getSession()方法session=HibernateUtils.getSession();//4.开始事务transaction=session.beginTransaction();//5.操作Customer cus=(Customer)session.get(Customer.class,2);System.out.println(cus);   //6.提交事务transaction.commit();//7.关闭资源session.close();} catch (HibernateException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//更新操作@Testpublic void update(){    try {//直接引用HibernateUtilS工具类中的getSession()方法session=HibernateUtils.getSession();//4.开始事务transaction=session.beginTransaction();//5.操作Customer cus=(Customer)session.get(Customer.class,1);//修改地址为beijingcus.setCity("青岛");//存在就更新,不存在就执行插入操作session.saveOrUpdate(cus);//6.提交事务transaction.commit();//7.关闭资源session.close();} catch (HibernateException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

通过单元测试:

insert()测试:

数据库中成功添加username=“小良”的一组数据

select()测试:

成功搜索到数据

update()测试:

成功将username="肖嘉良"的city信息将哈尔滨更新成青岛

delete()测试:

成功删除数据

执行成功

Hibernate2:构建单例模式的SessionFactory相关推荐

  1. 大牧絮叨设计模式:单例模式

    文章目录 1.单例模式概述 1.1. 核心组件 1.2. 优点缺陷 2. `Java`实现 2.1.饿汉式单例模式 2.2. 懒汉式单例模式 3. `Python`实现 3.1. 单实例操作 3.2. ...

  2. 如何用Dart写一个单例

    由于Dart拥有factory constructors,因此构建单例模式很容易. class Singleton {static final Singleton _singleton = new S ...

  3. hibernate教程--常用配置和核心API详解

    一.Hibernate的常用的配置及核心API. 1.1 Hibernate的常见配置: 1.1.1.核心配置: 核心配置有两种方式进行配置:  1)属性文件的配置: * hibernate.prop ...

  4. hibernate教程--常用配置和核心API

    一.Hibernate的常用的配置及核心API. 1.1Hibernate的常见配置: 1.1.1.核心配置: 核心配置有两种方式进行配置: 1)属性文件的配置: * hibernate.proper ...

  5. Hibernate与数据库分表

    2019独角兽企业重金招聘Python工程师标准>>> 数据库分片(shard)是一种在数据库的某些表变得特别大的时候采用的一种技术. 通过按照一定的维度将表切分,可以使该表在常用的 ...

  6. Mybatis执行流程分析_自定义简易Mybatis框架

    自定义简易Mybatis框架 Mybatis执行流程分析 Mybatis代码编写流程: Mybatis配置文件加载过程: 需求分析及技术概述 根据上述的功能结构图, 得出如下需求: 1. 需要具有配置 ...

  7. 今天讲讲hibernate的简单使用

    本文适合刚刚接触的hibetnate的小白哦. 首先我们必须知道hibernate是什么?它能干什么?以及怎么用? 我们学习它之前必须明白一个思想 下面是使用Hibernate的核心思想哦. 创建实体 ...

  8. mybatis 入门搭建

    首先导包 依赖如下 <dependencies><dependency><groupId>mysql</groupId><artifactId&g ...

  9. Boost搜索引擎项目

    目录 1.项目相关背景 2.搜索引擎的相关宏观原理 3.搜索引擎技术栈和项目环境 4.正排索引 && 倒排索引--搜索引擎原理 5.编写数据去标签与数据清洗的模块 -- parser. ...

最新文章

  1. APACHE工作原理详解
  2. c#学习路线应该靠谱
  3. 左神算法:在二叉树中找到累加和为指定值的最长路径长度(Java版)
  4. 【Lolttery】项目开发日志 (二) 数据库的二三事
  5. Linux负载均衡软件LVS之一(概念篇)
  6. ubuntu 14.04 将窗体button移到右边
  7. etymology-I
  8. 计算机应用与推广,计算机在中小学教学中的推广和应用
  9. 关于如何在Listener中注入service和ServletContextListener源码分析
  10. iOS动画系列之四:基础动画之平移篇
  11. 设计模式之:策略模式
  12. rpc error: code = Unavailable desc = connection error: desc = “transport: Error while dialing readin
  13. 《Linux内核设计与实现》读书笔记(四)- 进程的调度
  14. php 图片生成vr_vr全景技术难吗?vr全景技术原理和应用讲解
  15. 备品管理方案怎么写_备品备件管理制度62802
  16. 1354:括弧匹配检验
  17. mysqlcheck命令时提示: bash: mysqlcheck: command not found
  18. 抓取网络源码python_python中的复仇者网络抓取实体提取和网络图
  19. Jetson-Xavier-NX使用教程(这里说插上烧好镜像的SD卡上电就可以直接用了)
  20. 【财务_会计1_1】会计概念和目标

热门文章

  1. 51单片机模拟电梯控制(含完整代码)
  2. 大公司病了,这也太形象了吧!!!
  3. opencv-python最全下载地址
  4. 什么是hql以及hql和sql的区别
  5. 卷一:C佳佳语法第1篇
  6. 民众不要相信世界末日传言
  7. 新零售分销系统开发模式设计
  8. 云服务器php文件怎么运行,云服务器php文件怎么运行环境
  9. python3+正则(re)增量爬虫爬取笔趣阁小说( 斗罗大陆IV终极斗罗)
  10. Android11 WMS 之 AppTransition