Hibernate学习---Configuration,Session,SessionFactory
上一节我们讲到了Hibernate的测试,并且给出了测试代码,刚开始看见这个测试代码的同学估计是一头雾水把,所以这一节我们来讲一下测试代码。
本节主要内容:
- Configuration
- SessionFactory
- Session
首先我们再来看一下上一节的测试代码:
//加载配置文件
Configuration config = new Configuration().configure();
//根据配置文件创建会话工厂
SessionFactory factory = config.buildSessionFactory();
//根据会话工厂创建会话
Session session = factory.getCurrentSession();
//创建一个事物对象
Transaction tx = session.beginTransaction();
//new 一个学生对象
Student student = new Student("小三",19,99);
//将对象持久化到数据表中
session.save(student);
//提交事务
tx.commit();
//关闭会话
session.close();
//关闭工厂
factory.close();
Configuration:
首先是Configuration,它是用来解析我们配置的一个类,它加载配置的时候使用了这段代码:
Configuration config = new Configuration().configure();
看到这段代码的第一感觉是为啥还要在后面加一个方法,直接new一个Configuration不就行了吗,为啥还加了一个configure方法。
我们来打开源码瞧瞧:
public Configuration configure() throws HibernateException {
return configure( StandardServiceRegistryBuilder.DEFAULT_CFG_RESOURCE_NAME );
}
看到了没,configure方法返回了一个有参的方法,且参数为:
StandardServiceRegistryBuilder.DEFAULT_CFG_RESOURCE_NAME
我们跟进去会发现这个参数是StandardServiceRegistryBuilder类定义的一个名字叫hibernate.config.xml的成员变量。
所以我们可以得出一个结论:如果你采用以下段代码来加载配置文件那么你的主配置文件名字必须叫作hibernate.config.xml
Configuration config = new Configuration().configure();
当然你也可以自定义,例如这样随意指定:
Configuration config = new Configuration().configure("xxx.xml');
但是我们建议使用hibernate指定的配置文件名。
这里我们只介绍这些,所以对于Configuration我们仅需要知道它是用来加载配置文件即可,以后具体分析,现在我们先将hibernate的基本原理讲明白就好。
SessionFactory:
SessionFactory factory = config.buildSessionFactory();
我们知道主配置文件里面最外面的便是<hibernate-configuration>
接下来就是<session-factory>
,所以通过Configuration实例对象的buildSessionFactory可以根据我们的配置文件建立会话工厂。值得注意的是SessionFactory是一个重量级的组件,是一个单例的,线程安全的。按理说单例对象一定是被共享的是线程不安全的,我们将它的实现类SessionFactoryimpl打开看发现它的大多数的成员变量都是final的,所以它是线程安全的。
一般SessionFactory实例都不进行关闭(开销太大),而是在应用结束的时候自动将其销毁。
Session:
session由SessionFactory的getCurrentSession()或者openSession()进行创建,在web应用中,每当有一个用户访问时就会为这个用户创建一个Session,所以Session是多例的,它包含了许多非final变量,对同一个用户可能会产生多个事务,若多事务同时对Session的同一个变量进行访问就会引起并发的问题从而导致线程不安全。
上面提到了Session的两种获取方式,接下来我们说一下两种方式的区别:
getCurrentSession无论执行多少次只要是在同一个线程中它获取到的都是同一个Session对象,使用这个方法获取的Session对象是由ThreadLocal变量存储的(ThreadLocal在我的多线程文章里面有介绍),它的底层是一个Map,key就为线程的名字,所以用这个方法创建的Session对象是线程唯一的。
它创建Session对象的时候会进行判断,判断线程是是否已经存在session,如果不存在便进行创建。以下便是它的实现源码(有源码有真相):
public Session getCurrentSession() throws HibernateException {
if ( currentSessionContext == null ) {
throw new HibernateException( "No CurrentSessionContext configured!" );
}
return currentSessionContext.currentSession();
}
如果不存在那么久进行创建,底层也是通过openSession创建:
protected Session buildOrObtainSession() {
return baseSessionBuilder()
.autoClose( isAutoCloseEnabled() )
.connectionReleaseMode( getConnectionReleaseMode() )
.flushBeforeCompletion( isAutoFlushEnabled() )
.openSession();//就是这里
}
具体的逻辑太多,不方便一直跟下去,所以有兴趣的可以一直跟下去。
openSession进行创建时,每执行一次便会创建一个Session对象,所以需要我们手动关闭,而getCurrentSession不用关闭。
getCurrentSession获得的Session对象不用注册便能够使用而openSession无需注册。
getCurrentSession获得的session对象一定要在事务里面执行,而openSession获得的对象可以不在事务里面执行。
以上就是对两种获取方式的简单总结。
Hibernate学习---Configuration,Session,SessionFactory的更多相关文章
- [原创]java WEB学习笔记77:Hibernate学习之路---Hibernate 版本 helloword 与 解析,.环境搭建,hibernate.cfg.xml文件及参数说明,持久化类,对象-关系映射文件.hbm.xml,Hibernate API (Configuration 类,SessionFactory 接口,Session 接口,Transaction(事务))
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Hibernate学习---用Session实现CURD
我们使用Hibernate的目的是什么?对数据库进行操作,所有接下来我们就用Hibernate来进行CURD. 前边我们已经分析过了Configuration,SessionFactory和Sessi ...
- Hibernate学习三----------session详解
© 版权声明:本文为博主原创文章,转载请注明出处 如何获取session对象 1. openSession 2. getCurrentSession - 如果使用getCurrentSession需要 ...
- Hibernate 的Configuration、sessionFactory和session和transaction对象解释
1.Configuration对象: Configuration conf=new Configuration(); conf.configure(); 1.1 到 src下面找到名称hibernat ...
- [原创]java WEB学习笔记94:Hibernate学习之路---session 的管理,Session 对象的生命周期与本地线程绑定
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- [原创]java WEB学习笔记79:Hibernate学习之路--- 四种对象的状态,session核心方法:save()方法,persist()方法,get() 和 load() 方法,update()方法,saveOrUpdate() 方法,merge() 方法,delete() 方法,evict(),hibernate 调用存储过程,hibernate 与 触发器协同工作
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Hibernate二次学习二----------session.flush、session.doWork
目录 1. session 2. session.flush 3. session.doWork 4. 完整代码 5. 总结 © 版权声明:本文为博主原创文章,转载请注明出处 1. session H ...
- Hibernate学习---第十四节:hibernate之session线程安全
1.hibernate.cfg.xml 文件中添加如下代码开启线程安全: <property name="hibernate.current_session_context_class ...
- 【Hibernate学习笔记-3】在Spring下整合Hibernate时, 关于sessionFactory的类型的说明
摘要 在Spring下整合Hibernate时,关于sessionFactory的配置方式主要有两种,分别为注解配置方式,和xml配置方式,下面将对这两种配置方式进行介绍. 1. sessionFac ...
随机推荐
- 九、VueJs 填坑日记之在项目中使用jQuery
很多人学习 js 都是从 jQuery 开始的,我也不例外.有时候进行一些操作的时候,还是感觉 jQuery 比较好用,那么,我们如何在项目中使用 jQuery 呢?这篇博文带你实践. 引用 jQue ...
- HTML5学习的价值是什么?
随着互联网的发展和移动端的发展,很多公司对HTML5前端开发的需求旺盛,市场人才短缺供不应求. 对于HTML5的迅速发展和市场的大量需求,究竟为何HTML5如此受欢迎,它的价值在哪里呢? 语义特性(C ...
- head first python菜鸟学习笔记(第四章)
1,p124,错误:NameError: name 'print_lol' is not defined 要想文件内如图显示,需要把调用BIF print()改为调用第二章的nester模块中的pri ...
- CORS(跨站资源共享)介绍
起因 有同学在nginx站点配置中加了一行Access-Control-Allow-Origin *,导致微信中业务数据异常,抓包看http头有两个Access-Control-Allow-Origi ...
- JavaScript各种继承方式和优缺点
好久没写博客啦,嘻嘻,这个月是2017年的最后一个月啦,大家应该都开始忙着写年终总结了吧,嘻嘻,小颖今天给大家分享下Javascript中的几种继承方式以及他们的优缺点. 1.借助构造函数实现继承 原 ...
- 中文编程语言之Z语言初尝试: ZLOGO 4
原文: https://zhuanlan.zhihu.com/p/31505895. 作者为本人. @TKT2016 开发的Z语言(ZLOGO是它的一个部分)是本人至今看到的唯一一个仍活跃开发的开源且 ...
- Win10 之最新最简单有效安装配置adb
今天在新买的笔记本上安装配置adb,开始觉得挺简单的事,公司win7电脑上有现成的,但实际过程中--没想的那么简单了!好了,废话少说,直接正题. 研究了好一会下,总算搞定,总结如下: 1.下载Andr ...
- node实现一个WEBSOCKET服务器
早点时候翻译了篇实现一个websocket服务器-理论篇,简单介绍了下理论基础,本来打算放在一起,但是感觉太长了大家可能都看不下去.不过发现如果拆开的话,还是不可避免的要提及理论部分.用到的地方就简要 ...
- 51Nod--1018排序
1018 排序 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出N个整数,对着N个整数进行排序 Input 第1行:整数的数量N(1 <= N ...
- 2016第七届 蓝桥杯 全国总决赛B题(完全平方数) (练习)
道友给看了一道题目,就记录一下吧 题目: 给你0,1,2,3,4,5,6,7,8,9十个数字,要你选出任意一个或几个组合在一起成为完全平方数,每个数字都必须选且只能选一次,求可能的方案. 比如有其中几 ...