hibernate中的session是一级缓存,可以理解为进程级的缓存。在进程运行期间一直存在。 
 
 session可以理解为一个可以操作数据库的对象 具体如何操作数据库? session中有方法, 如果只是单独的hibernate程序的话. 获得session之后,打开事务,操作数据库,提交(回滚事务),关闭session.就这样完成了操作DB 
 ? 

Hibernate中session的使用:

在Hibernate中session主要是用来操作数据库?

Hibernate在操作数据库前需要得到Session的实例,这个类似于jdbc中的Connection。

获得Session的方法如下:

Session session = sessionFactory.openSession();

通过Session对象可以对数据库进行增删改查的操作,对应的方法分别为:save(),delete(),update(),saveOrUpdate(),load(),get()。

在Hibernate 3中,取消了find()方法,必须通过Query或Criteria来进行查询。

对于session这个接口的学习可以说是最痛苦也是最复杂的,因为它所涉及的方面太多了,一些隐藏的机制也很多,谁让它是Central API呢。

对于它的几个最基本的方法如save()、delete()、flush()等的学习都花了我一定的时间。在深入了解这些这些方法前,了解session的缓存机制以及Hibernate中Java对象的状态对我们是很有帮助的。

一.Session的缓存

Java是纯面向对象的语言,因此不可能像C语言那样直接操纵内存,例如声明一段可用的内存空间。在Java里面,缓存通常是指Java对象的属性占用的内存空间,通常是一些集合类型的属性。在session接口的实现类SessionImpl中定义了一系列的Java集合,这些Java集合就构成了Session的缓存。

使用缓存的一个很明显的好处就是可以减少数据库访问的频率,提高应用程序的性能,因为从内存中读取数据显然要比从数据库中查询快多了。根据我个人的理
解,Session的缓存实际上起到了一个“过渡仓库”作用。就像魔兽中的英雄一样,身上都会背有一个包,用来存放常用的物品如补血药水、补魔药水、回城
卷等等。如果想用回城卷而身上没有回程卷的话就要跑到商店去shopping了,这样就会浪费大量的时间了,除非你此刻就在商店旁边;如果想用的回城卷的
时候身上就有的话,英雄就可以直接用而不必大老远的跑到商店去了。我们的Session的缓存可以说就相当于英雄身上的背包,我的应用程序就是英雄,而数据库就是商店咯。

当然这个比喻不是很准确了,比方说在Hibernate应用中我们可以向数据库插入一条新的记录,而在魔兽中你是不可能给商店增加存货量的,只是为了便于理解,才作了这么一个对比。

二.Hibernate中Java对象的状态

在一个Hibernate应用中,Java对象可以处于以下三个状态之一:

1.临时状态(Transient)。处于这个状态的对象还被没有纳入Hibernate的缓存管理体系,跟任何session都不关联,在数据库中也没有对应的记录。

2.持久化状态(Persistent)。处于这个状态的对象位于Session的缓存中,并且和数据库中的一条数据记录相对应。

3.游离状态(Detached)。处于这个状态的对象不再位于Session的缓存中,它与临时对象的最大区别在于,游离对象在数据库中还可能存在一条与它对应的记录。

上述3个状态之间是可以相互转化的,而且我们所说的状态都是针对某一个session实例而言的,比方说,对象A对于session1而言是处于持久化状
态的,因为它处于session1的缓存中,但是对于session2而言对象A并不在它的缓存中,因此它是处于游离状态的。

对于这几个状态的理解花费了我一定的时间,因为总是有一些稀奇古怪的念头在我脑海中产生。比如说,对于临时状态的定义,如果我新建一个对象,然后人为的让
它属性的值和数据库中的一条记录对应,包括id的取值都一样。此时它能否说是处于游离状态呢?因为它和一条记录想对应呀。实际上这些情况都是由于一些不和
规范的操作而产生的。在Hibernate应用中,无论Java对象处于临时状态、持久化状态还是游离状态,应用程序都不应该修改它的OID。OID的值应该由Hibernate来维护和负责,实际上Hibernate在同步缓存中的对象与数据库中的记录时,都是通过OID来进行关联和映射的,如果应用程序人为的修改了对象的OID,就会导致一些莫名其妙的错误,而且这样也不利于数据的同步。

鸣谢:http://blog.knowsky.com/257681.htm

hibernate中session的更多相关文章

  1. Hibernate中Session的get和load

    hibernate中Session接口提供的get()和load()方法都是用来获取一个实体对象,在使用方式和查询性能上有一些区别.测试版本:hibernate 4.2.0. get Session接 ...

  2. hibernate中session的获取使用以及其他注意事项

    hibernate中session的获取使用以及其他注意事项 前言:工作时,在同时使用Hibernate的getSession().getHibernateTemplate()获取Session后进行 ...

  3. Hibernate中Session与本地线程绑定

    ------------------siwuxie095 Hibernate 中 Session 与本地线程绑定 1.Session 类似于 JDBC 的连接 Connection 2.Session ...

  4. [转]Hibernate中Session的get和load

    hibernate中Session接口提供的get()和load()方法都是用来获取一个实体对象,在使用方式和查询性能上有一些区别.测试版本:hibernate 4.2.0. get Session接 ...

  5. Hibernate中Session之get和load方法的真正区别

    最近在学习SHH框架中的hibernate,对Session的get和load方法,有点混不清楚,不知道区别在哪,或者对它们的区别感触不深.所以百度了一下,结果问题来了.百度的结果和实际测试的结果出入 ...

  6. Hibernate中Session.get()方法和load()方法的详细比较

    一.get方法和load方法的简易理解  (1)get()方法直接返回实体类,如果查不到数据则返回null.load()会返回一个实体代理对象(当前这个对象可以自动转化为实体对象),但当代理对象被调用 ...

  7. hibernate中session的线程安全问题

    Hibernate的基本特征是完成面向对象的程序设计语言到关系数据库的映射,在Hibernate中使用持久化对象PO(Persistent Object)完成持久化操作,对PO的操作必须在Sessio ...

  8. Hibernate中Session.get()/load()之区别

    原文链接http://sunxin1001.iteye.com/blog/292090 Session.load/get方法均可以根据指定的实体类和id从数据库读取记录,并返回与之对应的实体对象.其区 ...

  9. HttpSession与Hibernate中Session的区别

    一.javax.servlet.http.HttpSession是一个抽象接口 它的产生:J2EE的Web程序在运行的时候,会给每一个新的访问者建立一个HttpSession,这个Session是用户 ...

随机推荐

  1. C#算法基础之递归排序

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. ubuntu(16.04.01)学习-day1

    1.修改root用户密码 sudo passwd root 按提示进行设置. 2.从Ubuntu 16.04开始,用户可以实现改变启动器的位置,可以将启动器移到屏幕底部,但是无法移到右边或顶部.打开终 ...

  3. Android布局属性全面剖析

    第一类:属性值为true或false android:layout_centerHrizontal 水平居中 android:layout_centerVertical 垂直居中 android:la ...

  4. 如何查看JDK是64bit还是32bit

    在eclipse或MyEclipse中创建一个Java Project并运行如下代码: public class Test { public static void main(String[] arg ...

  5. JAVA静态和非静态内部类

    JAVA静态和非静态内部类 一直对java的静态和非静态内部类的东东理解不清楚,今天测试了一下,下面把测试结果记录一下,加深印象.用于以后查找. 直接上代码. package com.test.xml ...

  6. a2x

    #include <typeinfo> template <typename T> bool a2x( T& _f , char* p) { if( !p ) retu ...

  7. C# Redis实战

    转自  :http://blog.csdn.net/qiujialongjjj/article/details/16945569 一.初步准备 Redis 是一个开源的使用ANSI C 语言编写.支持 ...

  8. Mac下使用Web服务器性能/压力测试工具webbench、ab、siege

    Web开发,少不了的就是压力测试,它是评估一个产品是否合格上线的基本标准,下面我们来一一剖析他们的使用方式. 测试前,前面先把系统的端口限制数改大,看看Mac下面的默认限制 ulimit -a ope ...

  9. AngularJS(10)-数据验证

    AngularJS 表单和控件可以提供验证功能,并对用户输入的非法数据进行警告.客户端的验证不能确保用户输入数据的安全,所以服务端的数据验证也是必须的. <!DOCTYPE html> & ...

  10. 医学影像工作站程序ProDicom的说明

    转载 http://blog.csdn.net/prodicom/article/details/4015064 注意:以下内容为转载,但保留了第一人称,请注意,以免造成不必要的麻烦. 医网联影像工作 ...