首页 > 编程知识 正文

session存储方式(浅谈hibernate的sessionFactory和session)

时间:2023-05-06 06:54:45 阅读:123786 作者:4385

首先,我要说一个悲伤的故事。

有一天,本以为自己是javaEE叼着的程序员,久违地不写java代码,去阿里巴巴参加了java面试。 而且,被问简单的问题时,结果没能很好地回答。 那接下来谈谈这个问题吧。

hibernate的会话工厂在做什么? session在做什么?

那么,你能行吗? 可以说清楚吗? 如果答案是“是”,就不需要往下看。 如果你还是想往下看,

请看。

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

一、什么是hibernate?

Hibernate是一个开源对象关系映射框架,它非常轻量级地封装了JDBC,使Java程序员能够使用对象编程思维来操作数据库。 Hibernate可用于使用JDBC的任何情况。 可以在Java客户端程序中使用,也可以在servlet/JSP web APP应用程序中使用。 ---百度百科

其实我自己的理解是,使用hibernate,最常用的情况是使用其ORM机制,将传统的关系数据库操作转换为面向对象的方式进行操作。 为什么会这样呢? 在没有使用ORM之前。 在一个简单的例子中,你在表格中填写了多个数据、姓名、性别和年龄。 爱好等。 然后,使用JDBC连接到数据库。 然后,逐个从request或某个地方读取数据。 如果有100个,则表示需要定义100个变量来临时存储这些表单数据。 然后,保存到数据库中。 保存时,还执行以下写入sql语句,并再次传递100个值。 如果是1000个的话。 想想就累。 我现在在一家公司,在学习使用PHP、存储数据的时候,就这样一下子下来,心里很累。

那么,如果有ORM,在什么情况下,您只需要将相应数据库中的表映射到一个对象(如student )。 然后,在对应于表单的input的name中填写对应对象的对应属性(例如student.name ),在保存时,在提交的操作中定义student的对象实例后,可以使用这些数据只是说明效率)。 然后,只需保存此对象即可。 不是感觉好多了吗?

二.什么是会话工厂

会话工厂接口负责初始化Hibernate。 充当数据存储源的代理,负责创建Session对象。 这里进入了工厂模式。 需要注意的是,会话工厂不是轻量级的。 因为一个项目通常只需要一个SessionFactory,如果需要处理多个数据库,则可以为每个数据库指定一个SessionFactory。 ---百度百科

在我的理解中,实际上ygddt、sessionfactory是创建session会话(具体来说是以后)的工厂。 请考虑一下,在需要使用session的时候,有一个特别大的工厂可以做那个。 突然记起一个冷漠的笑话,如果你没有对象怎么办? 方法是出现一个新消息。 你没有笑,我知道)。 但是,需要注意的是,通常一个web工程(系统)只有一个数据库(如果在学校做项目,则只有一个)。 哈哈),那么这个项目一个sessionfactory就足够了。 此项目中涉及的所有会话都由此会话工厂管理。

接下来,创建会话工厂。 一般来说,有两种创建方法:从1.XML文件读取配置信息以生成sessionfactory,从Java属性文件读取配置信息以生成sessionfactory。

第一个:

1 )实例化配置对象,缺省情况下读取src目录中的hibernate.cfg.xml,配置文件

span style='font-size:18px;' 配置配置=new配置().configure ); /span或configure (; 列出了文件名和路径。 span style='font-size:24px;' configuration config=new configuration ().configure('hibernate.CFG.XML ' ); /span

2 )当前,此config对象包含所有Hibernate运行时参数。 可以使用Configuration实例的buildSessionFactory ) )方法构建唯一的SessionFactory。

span style='font-size:24px;' sessionfactorysessionfactory=config.buildsessionfactory (/span

3 )获得此sessionfactory对象后,可以开始另一个话题

三.什么是会话

举起来

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

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

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

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

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

<span style="font-size:24px;">public void save(Student student) {Transaction transaction= getSession().beginTransaction(); //开启事务getSession().save(student);//只要传一个Student的对象实例transaction.commit(); //事务提交 getSession().close();//关闭session}</span>


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

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


版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。