`
dengyll
  • 浏览: 90466 次
社区版块
存档分类
最新评论

一点点学习Hibernate3.6 -对象的状态

阅读更多

  • hibernate的设计者为了更好的维护对象,以便生成恰当的SQL语句,引入了对象的状态这个概念.hibernate文档里面描述hibernate的状态分为三种:

  • 瞬时(Transient),又称临时状态
  • 持久(Persistent)
  • 脱管(Detached)又称游离状态

    其实我也觉得如果按照Hibernate的关于对象的状态定义,状态应该分为四种才对:

    多了一个删除状态,因为游离状态本身也是有对象引用,只是没有被session管理起来,不会被gc回收.四种对象状态的完整定义:

  • 临时:一般是新new的对象
  • 持久:有OID,对对象的操作都会同步到数据库中
  • 游离:对象有OID,并且与数据中的某条记录对应,修改对象不会同步到数据库
  • 删除:session调用了delete()方法把对象从数据库中删除后状态

    对象状态虽然不多,但是在使用中要格外小心,只有持久状态的对象才能同步到数据库中.管理对象状态的常用方法:

  • save():使临时对象持久对象(把对象交给Session管理)
  • update():把游离对象变为持久对象(把对象交给Session管理)
  • saveOrUpdate():把临时对象或游离对象变为持久对象,通过OID判断对象为什么对象
  • delete():把持久或游离状态变为删除状态(只要是数据库中有记录,就能删除,没有就报错)
  • get():立即加载,如果指定ID的数据不存在,则返回null
  • load():延迟加载,但实体类不能是final的,否则延迟加载失效,如果指定id的数据不存在,则抛异常

    上面这些方法中需要特意说下的是load()方法.load()方法是基于类的懒加载,也就是class标签的lazy属性,默认值为true.在为true的情况下调用load()方法会返回一个代理类,且是一个没有初始化的代理类,只有当使用这个类的某个方法时才会去真正的加载记录;如果没有在数据库中找到对应的记录,则抛出异常.如果类的修饰符是fianl,由于hibernate是使用的继承创建的代理类,所以在这种情况下就不能创建代理类,将立即加载.

    Hibernate中有二级缓存的概念,既然有二级缓存,那也自然就有"一级缓存"了,实际上,一级缓存就是session的缓存,Session 接口是Hibernate向应用程序提供的操纵对数据库的最主要的接口,它提供了基本的保存,更新,删除和加载Java对象的方法.Session接口的实现中包含了一系列的集合,这些集合构成了Session缓存,只要Session实例的生命周期没有结束,存放在它缓存里的对象也不会结束生命周期,因为还有这些集合在引用这些对象.所以如果有对象已经不需要了,就要即时的清除.把对象变为游离状态或者删除状态.

    Session提供了一系列对缓存进行操作的方法:

  • clear():清空Session(把Session的缓存中所有的对象全部清除出去)
  • evict(Object):把指定的对象从Session缓存中驱逐出去
  • flush():把Session缓存中的状态马上同步到数据库.默认情况下,生成的update语句、delete语句都是在flush()执行的时候执行,
              在事务提交的时候会自动的先flush()一下.但是insert语句在什么时候执行,是跟主键生成策略有关的.如果是由数据库生成主
              键,则遇到insert()语句会马上执行,因为需要得到主要值,以便之后使用;如果生成策略是assigned,则会在flush()执行的时候
              执行,因为主键值是由你提供的,所以Hibernate不用问数据库也知道.但是调用flush()方法可以让缓存里面的语句马上执行,以同步状态.
  • refresh(Object):让缓存中的对象与数据库中的数据状态一致.假如我要把一个对象变成持久状态,我先把它从数据库从拿出来(从
               数据库中取出就是持久状态),然后把它的数据进行更新,存储到某个地方,如果在更新---存储的过程之间,数据被另一个人修
               改了,我存储的时候也无法获取最新的数据,因为Hibernate已经查询过一次,已经有了这个对象的持久状态,它便不会再进行
               查询,这个时候如果想要获取最新的数据,就要使用refresh(Object)方法,把想要更新的对象传入进去,Hibernate就会进行再次查询. 

  • 2
    0
    分享到:
    评论

    相关推荐

    Global site tag (gtag.js) - Google Analytics