Hibernate的核心接口--- Session

Hibernate的核心接口--- Session

一 Session简单介绍

1.session概念

Session是Hibernate中应用最频繁的接口,Session也被称为持久化管理器,它负责所有的持久化工作,负责管理持久化对象的生命周期,提供第一级别的高级缓存来保证持久化对象的数据与数据库同步

2.Session的特点

(1)单线程,非共享的对象。线程不安全,在设置软件架构时,应该避免多个线程共享一个Session实例

(2)Session实例是轻量级的,它的创建和销毁不需要消耗太多的资源,可以为每次请求分配一个Session实例,在每次请求过程中及时创建和销毁Session实例。

(3)Session有一个缓存,它存放当前工作单元加载的对象,session缓存被称为Hibernate第一个缓存。

3.Session缓存

Java中,缓存通常是指java对象的属性占用的内存空间,一般使用集合类型的属性来作为缓存。Session这一级别的缓存通常称之为一级缓存,是由它的实现类SessionImpl中的成员属性persistenceContext中定义的一系列java集合属性构成的。

当应用程序调用Session的CURD方法以及调用查询接口的list(),iterati()或filter()方法时,如果在缓存中不存在相应的对象,Hibernate就会把该对象加入到一级缓存中,如果在Sessoin缓存中已经存在这个对象,就不需要再去数据库加载而是直接使用缓存中的这个对象,可以减少访问数据库的频率,提高程序运行的效率。当Session在清理缓存时,Hibernate会自动进行脏数据检查,根据缓存中的对象的状态变化来同步更新数据库。

在利用Session进行持久化操作时,当调用Transaction的commit()事务提交方法时,会自动进行缓存清理同步数据库

Session接口提供了几个跟缓存相关的方法

(1)flush()刷新缓存,它与事务提交commit()方法有不同之处,flush()进行缓存的清理,执行一系列的SQL语句,但是不会提交事物,而commit()方法会先调用flush()方法,然后再提交事物。

(2)setFlushMode()可以自定义设置清理缓存的时间点

(3)getFlushMode()获取当前缓存清理的模式

二 持久化生命周期

1.瞬时状态(tansient)

该实例是刚用new语句创建的,还没有被持久化,不处于任何Session的缓存,它没有对象标识符值(主键值)

特点:不跟任何一个Session实例关联,在数据库中没有对应的记录

2.持久化状态(persistent)

已经被持久化,加入到Session缓存中,实例目前与某一个Session有关联,它拥有对象标识符,并且可能在数据库中有一个对应的行,Hibernate保证在同一个Session实例的缓存中,数据库中的每一条记录只对应唯一的一个持久化实例

特点:持久化对象总是被一个Session实例关联。持久化实例和数据库中相关的记录对应,Session在清理缓存时,会根据持久化实例的属性数据变化,同步更新数据库。

3.脱管状态(detached)

已经被持久化过,但已经不处于Session的缓存中,实例曾经与某个Session上下文发生过关联,不过那个上下文已经被关闭,它拥有对象标识符值,并且在数据库中可能存在一个对应的行

特点:不再位于Session的缓存中,即它不再和Session关联,但它拥有对象标识符值。


三 Session的基础操作

1.save()方法:持久化给定的瞬时实例,并返回该实例的对象标识符值

当调用save()方法时,它会完成以下操作:

(1) 把瞬时对象加入到当前Session的缓存中,使它变成持久化对象。

(2) 选用映射文件指定的主键生成器为此持久化对象分配唯一的OID。

(3) 计划执行一个insert语句,把此持久化对象的当前属性值组装到insert语句中,只有当session清理缓存时,才会执行SQL insert语句。如果在save方法之后修改了持久化对象的属性值,Session清理缓存时会额外执行 SQL update语句

2.get()方法:根据给定的OID返回一个持久化实例

get方法先检查当前的Session缓存中是否存在这个标识符的持久化实例,如果存在就直接返回,如果不存在就检查二级缓存中是否存在,如果存在就直接返回,如果不存在,就从数据库中获取数据返回,如果数据库表中不存在就返回null。

3.load()方法:根据给定得到OID返回一个持久化对象

load()方法先检查当前Session缓存中是否存在这个标识符值的持久化实例,如果存在直接返回,如果不存在,就检查二级缓存中是否存在,如果存在就直接返回,如果还不存在,Hibernate框架不检查数据库是否存在这个标识符的记录,而是会直接创建一个代理对象并返回,这个代理对象只包含标识符值,并没有其他属性的实际数据,这种方式就是懒加载。

注意:必须在session未关闭时进行

4.delete():把指定的持久化实例变成瞬时状态,并从数据库表中移除对应的记录。

如果传入的实例是持久化状态,Session就计划执行一个delete语句

如果传入的实例是脱管状态的,就先让它和当前Session关联转变为持久化对象,再计划执行一个delete语句

5.update():重附脱管对象,并把它的状态更新到数据库表中

把脱管对象加入到当前Session的缓存中,使得他变成持久对象

计划执行一个update语句,只有当Session清理缓存时,才会执行SQL update语句

6.saveOrUpdate():同时具有save和update的功能

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值