业余草谈SessionFactory中的Session和HttpSession的区别

原创 2017年09月22日 15:41:21

首先,讲一个悲伤的故事。。。

有一天,一个以为自己javaEE很叼的程序员,在经历了好久不写java代码的情况下,去参加阿里巴巴的java面试,然后,在被问到一个很简单的问题的时候,结果没有回答好。那么接下来先说说这个问题吧。。。

问:hibernate的sessionfactory是干嘛的?session又是干嘛的呢?

那么,你会吗?可以讲清楚么?如果答案是会,可以,那么你就不用往下看了。。。。如果会还是想往下看,那么,

你就看呗微笑

在回答这个问题之前,先来看看一些概念。

一、hibernate是什么?

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用。----百度百科

其实我自己的理解是,使用hibernate,最常用的场景是,使用它的ORM机制,然后把传统的关系型数据库操作,转换为面向对象的方式来操作。为什么这么做呢?在没有使用到ORM之前。一个简单的例子,你在表单上,填了好多个数据,姓名,性别,年龄。。。。。爱好等等等,然后你使用JDBC去连接数据库,接下来一条一条的把数据从request或者某个地方读进来,如果有100个,表示需要定义100个变量来暂存这些表单数据,然后在保存到数据库中,在保存的时候,也要一下下的写sql语句,再次传100个值。。。如果是1000个。。想想就好累,我现在某个公司,学习使用PHP,存储数据的时候,就是这样一下下来,心好累。

那么如果有了ORM,是什么情况,你只要把对应的数据库的表,映射为一个对象(比如student)。然后在表单对应的input的name上,填写对应对象的对应属性(比如student.name),然后在保存的时候,在提交到的Action中,定义一个student的对象实例,那么这些数据就会自动保存在这个对象中了(我用了Struts2,不扯这个,只是说明效率)。接下来,你只需要保存一下这个对象就ok了。是不是感觉方便了好多。

二、什么是sessionfactory

SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。----百度百科

我的理解是,其实顾名思义,sessionfactory,就是用来创建session会话(具体接下来讲)的工厂。想想有一个特别大的工厂,专门用来在你需要使用session的时候,让它帮你创建一个就好了。(突然记起来一个冷笑话,如果你没有对象怎么办?办法是,new一个出来呗。。额你没有笑,我知道微笑)。但是需要注意一下就是,一般来讲,一个web工程(系统),如果涉及到的是一个数据库(你在学校做项目,一般就一个吧。。。哈哈哈),那么本工程就只需要一个sessionfactory就够了。这个工程所涉及到的所有的session,都交由这个sessionfactory来管理。

接下来,创建一个sessionfactory,一般有两种创建方式,1.从XML文件读取配置信息构建SessionFactory,2.从Java属性文件读取配置信息构建SessionFactory(这个不熟悉,没怎用,不好意思)。

我的博客:CODE大全www.codedq.net业余草www.xttblog.com爱分享www.ndislwf.comifxvn.com

第一种:

1》实例化Configuration对象,默认读取src目录下的hibernate.cfg.xml,配置文件

  1. Configuration config = new Configuration().configure();
或者在configure();中指明文件名称和路径
  1. Configuration config = new Configuration().configure("hibernate.cfg.xml");

2》现在这个config对象,已经包括所有Hibernate运行期的参数,通过Configuration实例的buildSessionFactory()方法可以构建一个惟一的SessionFactory:

  1. SessionFactory sessionFactory = config.buildSessionFactory();

3》得到这个sessionfactory对象之后,就可以开始另外的话题了

三、什么是Session

提起来Session的话,首先想到的是http这个东东的session,想到了http这个无状态的协议,没办法保存任何访问对象的信息,所以就出现了session这个东东,用来记录访问者的一些信息。但是,好好转折一下下,转折,转折,转折说三遍。

我的博客:CODE大全www.codedq.net业余草www.xttblog.com爱分享www.ndislwf.comifxvn.com

在hibernate中的session并不是http中所说的session,一般把HttpSession对象称为用户会话。。。

而hibernate中的Session呢?是用来表示,应用程序和数据库的一次交互(会话)。在这个Session中,包含了一般的持久化方法(CRUD),不要说不知道CRUD是什么微笑。而且,Session是一个轻量级对象(线程不安全),通常将每个Session实例和一个数据库事务绑定,也就是每执行一个数据库事务,都应该先创建一个新的Session实例,在使用Session后,还需要关闭Session。(记得关闭哈)

我的博客:CODE大全www.codedq.net业余草www.xttblog.com爱分享www.ndislwf.comifxvn.com

接下来,创建一个Session对象,依据第二步得到的sessionfactory对象。

  1. Session session=sessionFactory.openSession();
然后得到这个session之后,就可以使用它来进行数据库的具体操作了,给一个简单的代码。多说一句,一般来说在使用session的时候,都会用到事务,尤其是需要对数据做修改的时候。上代码:

  1. public void save(Student student) {  
  2.     Transaction transaction= getSession().beginTransaction();  //开启事务  
  3.     getSession().save(student);//只要传一个Student的对象实例        
  4.     transaction.commit();  //事务提交   
  5.     getSession().close();//关闭session  

简单的总结一下。那么开始继续那个故事,应为那个程序员在面试的时候,没有记起来一些事情,尤其是hibernate的session和http的session的区别,导致很郁闷。所以做次简单的总结,希望给有需要的人一些帮助。因为自己理解的也不是很深刻,难免有些地方扯的不对,还望大家见谅,并提出来。

offer还未到手,同志还需努力。加油哦吐舌头!!!

我的博客:CODE大全www.codedq.net业余草www.xttblog.com爱分享www.ndislwf.comifxvn.com

版权声明:本文为博主原创文章,未经博主允许不得转载。

Hibernate中Session与HttpSession的区别

二、org.hibernate.Session 它是hibernate操作数据库的一个句柄对象。它跟上面那个Session唯一的相似处就是名字有点像,其他没任何一样的地方。 一般的Hibernat...
  • u010485626
  • u010485626
  • 2014年10月24日 19:29
  • 901

HttpSession和HibernateSession的区别

转自:http://blog.csdn.net/aimbetter/article/details/36667797 总而言之HttpSession是服务器tomcat自动创建的一个容器,而H...
  • HaleyLiu123
  • HaleyLiu123
  • 2017年04月30日 16:19
  • 234

浅谈hibernate的sessionFactory和session

首先,讲一个悲伤的故事。。。 有一天,一个以为自己javaEE很叼的程序员,在经历了好久不写java代码的情况下,去参加阿里巴巴的java面试,然后,在被问到一个很简单的问题的时候,结果没有回答好。...
  • jiangxindu1
  • jiangxindu1
  • 2015年08月28日 00:10
  • 22518

session和cookie的联系

其实session和cookie的区别大家都知道,这里着重讲联系。 区别: cookie存储在客户端,session存储在服务器端cookie不安全 大家很少了解到session和coo...
  • Lingphper
  • Lingphper
  • 2015年07月22日 14:23
  • 495

ServletContext类和HttpSession类的区别

package com.tsinghua; import javax.servlet.ServletContext; import javax.servlet.http.HttpServlet; i...
  • wuxinliulei
  • wuxinliulei
  • 2013年08月24日 20:27
  • 1078

hibernate之SessionFactory和Session

1. 关于SessionFactory 1.) SessionFactory是一个与连接池的类差不多的东西,在这里存着多个Session—与数据库的会话(相当于connection) 2.) 因为连...
  • zdp072
  • zdp072
  • 2016年04月13日 20:08
  • 909

HttpSession session = request.getSession()与HttpSession session = request.getSession(true)有何区别?

HttpSession   session   =   request.getSession()与HttpSession   session   =   request.getSession(true...
  • qaz13177_58_
  • qaz13177_58_
  • 2011年07月08日 16:04
  • 2479

Java - Hibernate中SessionFactory是线程安全的吗?Session是线程安全的吗(两个线程能够共享同一个Session吗)?

SessionFactory对应Hibernate的一个数据存储的概念,它是线程安全的,可以被多个线程并发访问。SessionFactory一般只会在启动的时候构建。对于应用程序,最好将Session...
  • chimomo
  • chimomo
  • 2017年11月06日 10:38
  • 615

Servlet中HttpSession

HttpSession HttpSession概述 什么是HttpSesssion javax.servlet.http.HttpSession接口表示一个会话,我们可以把一个会话内需要共享的数...
  • dzy21
  • dzy21
  • 2016年07月10日 13:40
  • 11121

Spring整合的Hibernate的框架中,HibernateTemplate、SessionFactory和Session之间的关系

SessionSession 也就是 Hibernate中一个事务操作的缓存对象,Spring封装Hibernate也就是封装对Session的操作,简化对session的操作。SessionFact...
  • violet_echo_0908
  • violet_echo_0908
  • 2016年04月11日 20:35
  • 2339
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:业余草谈SessionFactory中的Session和HttpSession的区别
举报原因:
原因补充:

(最多只允许输入30个字)