Hibernate学习(三):Session的缓存及对象的状态

对于session这个接口的学习能够说是最痛苦也是最复杂的,由于它所涉及的方面太多了,一些隐藏的机制也不少,谁让它是Central API呢。对于它的几个最基本的方法如save()、delete()、flush()等的学习都花了我必定的时间。在深刻了解这些这些方法前,了解session的缓存机制以及Hibernate中Java对象的状态对咱们是颇有帮助的。数据库

一.Session的缓存缓存

       Java是纯面向对象的语言,所以不可能像C语言那样直接操纵内存,例如声明一段可用的内存空间。在Java里面,缓存一般是指Java对象的属性占用的内存空间,一般是一些集合类型的属性。在session接口的实现类SessionImpl中定义了一系列的Java集合,这些Java集合就构成了Session的缓存。
       使用缓存的一个很明显的好处就是能够减小数据库访问的频率,提升应用程序的性能,由于从内存中读取数据显然要比从数据库中查询快多了。根据我我的的理解,Session的缓存实际上起到了一个“过渡仓库”做用。就像魔兽中的英雄同样,身上都会背有一个包,用来存放经常使用的物品如补血药水、补魔药水、回城卷等等。若是想用回城卷而身上没有回程卷的话就要跑到商店去shopping了,这样就会浪费大量的时间了,除非你此刻就在商店旁边;若是想用的回城卷的时候身上就有的话,英雄就能够直接用而没必要大老远的跑到商店去了。咱们的Session的缓存能够说就至关于英雄身上的背包,个人应用程序就是英雄,而数据库就是商店咯,以下图所示。固然这个比喻不是很准确了,比方说在Hibernate应用中咱们能够向数据库插入一条新的记录,而在魔兽中你是不可能给商店增长存货量的,只是为了便于理解,才做了这么一个对比。session

二.Hibernate中Java对象的状态ide

在一个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,就会致使一些莫名其妙的错误,并且这样也不利于数据的同步。
             至于对象之间的状态转化,若是跟session的各个方法放在一块儿讨论的话可能会更容易理解,这里就不赘述了。spa

相关文章
相关标签/搜索