hibernate三态、缓存、懒加载与急加载

@hibernate三态、缓存、懒加载与急加载
一、hibernate对象的三种状态

Hibernate中对象有三种状态: 临时状态(Transient)、持久状态(Persistent)、游离状态(Detached);

①临时状态:刚刚使用new语句创建,还没有被持久化,不处于Session的缓存中。处于临时状态的状态的Java对象被称为临时对象。(即只在内存中存在,与数据库无关)

②持久化状态:已经被持久化,加入到Session的缓存中。处于持久化状态的Java对象被称为持久化对象。(即内存中存在,数据库中也存在)

③游离状态:已经被持久化,但不处于session的缓存中。处于游离状态的Java对象被称为游离对象。(即内存中存在,在数据库中不一定存在)

三种状态间相互转换关系,及他们在数据库、session中的状态如下:

当我们new一个实体对象(pojo:persistent objiect:持久化对象)时,它处于瞬时态,此时与session、数据库均无任何关联。此后,我们获得session并开启hibernate事务,调用save()等方法,将pojo转变为持久态,此时session中存有这个pojo,但直到transaction.commit()被调用时,sql语句才会执行,此后数据库中也才有此条数据。但当commit()并且session.close()执行过后,pojo就变为了游离态,也就是说,数据库中有该记录,但session中不再有。
持久化状态的实例,也可以重新变成瞬时态,那就是调用delete()方法。通过get()或load()方法得到的pojo是持久态的。游离态的pojo可以通过update(),saveOrUpdate(),lock()和replicate()方法重新成为持久态。调用merge()方法后,pojo维持原态,但内容会被更新到数据库

二、hibernate的缓存
1、默认支持一级缓存,一级缓存是session级别
a、session关闭后,缓存就没了;hibernate发出一条sql查询,若缓存中没有,则从数据库中查,查到之后放入缓存
b、以id为key值缓存对象
2、可插拨式的缓存,二级缓存,二级缓存是sessionfactory 级别的缓存
a.hibernate没有提供相应的二级缓存组件,所以需要额外的二级缓存包EHcache
b.hibernate二级缓存存的仅仅是对象,就算只想查询这个对象的某几个属性,还是会把这个对象的所有信息查询出来。
c.当一级缓存关闭之后,一级缓存就失效了,若这个对象配置了二级缓存,就算session关闭,hibernate会从二级缓存(sessionFactory)中查到数据。

三、hibernate的加载机制
1、懒加载(延迟加载):就是当在真正需要数据的时候,才真正执行数据加载操作.load加载,但容易造成LazyInitializationException异常。如果出现这个异常,大部分是因为session被关闭了,还要从session中获取数据造成的。
但是懒加载也是有优势的,那就是效率高。因为我们查数据时不一定要把所有数据都查询出来。
2、急加载(立即加载):当实体加载完成后,立即加载该实体所关联的数据。
使用get获取数据,会立即查询,先到缓存中查找,找不到再到数据库中查找。
注:load支持延迟加载,get不支持延迟加载。如果没有设置延迟加载,那么load也会立即加载对象。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值