Hibernate2:构建单例模式的SessionFactory
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();}}
在测试类中直接引用工具类中的方法:
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()测试:
成功搜索到数据
成功将username="肖嘉良"的city信息将哈尔滨更新成青岛
delete()测试:
成功删除数据
执行成功
Hibernate2:构建单例模式的SessionFactory相关推荐
- 大牧絮叨设计模式:单例模式
文章目录 1.单例模式概述 1.1. 核心组件 1.2. 优点缺陷 2. `Java`实现 2.1.饿汉式单例模式 2.2. 懒汉式单例模式 3. `Python`实现 3.1. 单实例操作 3.2. ...
- 如何用Dart写一个单例
由于Dart拥有factory constructors,因此构建单例模式很容易. class Singleton {static final Singleton _singleton = new S ...
- hibernate教程--常用配置和核心API详解
一.Hibernate的常用的配置及核心API. 1.1 Hibernate的常见配置: 1.1.1.核心配置: 核心配置有两种方式进行配置: 1)属性文件的配置: * hibernate.prop ...
- hibernate教程--常用配置和核心API
一.Hibernate的常用的配置及核心API. 1.1Hibernate的常见配置: 1.1.1.核心配置: 核心配置有两种方式进行配置: 1)属性文件的配置: * hibernate.proper ...
- Hibernate与数据库分表
2019独角兽企业重金招聘Python工程师标准>>> 数据库分片(shard)是一种在数据库的某些表变得特别大的时候采用的一种技术. 通过按照一定的维度将表切分,可以使该表在常用的 ...
- Mybatis执行流程分析_自定义简易Mybatis框架
自定义简易Mybatis框架 Mybatis执行流程分析 Mybatis代码编写流程: Mybatis配置文件加载过程: 需求分析及技术概述 根据上述的功能结构图, 得出如下需求: 1. 需要具有配置 ...
- 今天讲讲hibernate的简单使用
本文适合刚刚接触的hibetnate的小白哦. 首先我们必须知道hibernate是什么?它能干什么?以及怎么用? 我们学习它之前必须明白一个思想 下面是使用Hibernate的核心思想哦. 创建实体 ...
- mybatis 入门搭建
首先导包 依赖如下 <dependencies><dependency><groupId>mysql</groupId><artifactId&g ...
- Boost搜索引擎项目
目录 1.项目相关背景 2.搜索引擎的相关宏观原理 3.搜索引擎技术栈和项目环境 4.正排索引 && 倒排索引--搜索引擎原理 5.编写数据去标签与数据清洗的模块 -- parser. ...
最新文章
- APACHE工作原理详解
- c#学习路线应该靠谱
- 左神算法:在二叉树中找到累加和为指定值的最长路径长度(Java版)
- 【Lolttery】项目开发日志 (二) 数据库的二三事
- Linux负载均衡软件LVS之一(概念篇)
- ubuntu 14.04 将窗体button移到右边
- etymology-I
- 计算机应用与推广,计算机在中小学教学中的推广和应用
- 关于如何在Listener中注入service和ServletContextListener源码分析
- iOS动画系列之四:基础动画之平移篇
- 设计模式之:策略模式
- rpc error: code = Unavailable desc = connection error: desc = “transport: Error while dialing readin
- 《Linux内核设计与实现》读书笔记(四)- 进程的调度
- php 图片生成vr_vr全景技术难吗?vr全景技术原理和应用讲解
- 备品管理方案怎么写_备品备件管理制度62802
- 1354:括弧匹配检验
- mysqlcheck命令时提示: bash: mysqlcheck: command not found
- 抓取网络源码python_python中的复仇者网络抓取实体提取和网络图
- Jetson-Xavier-NX使用教程(这里说插上烧好镜像的SD卡上电就可以直接用了)
- 【财务_会计1_1】会计概念和目标